以下笔记来源于课程《百度飞桨领航团零基础Python速成营》,小白入门安利。
课程链接:https://aistudio.baidu.com/aistudio/course/introduce/7073
一、函数
参数传递方法:位置参数、缺省参数、可变参数、关键字参数、命名关键字参数
(1)位置参数是最简单的一种函数调用的方式。位置参数须以正确的顺序传入函数、数量必须和声明时的一样。
def student_name_and_age(name, age): print('姓名:%s 年龄 %s' %(name, age)) student_name_and_age('张三', 18)
(2)缺省参数:调用函数时,缺省参数的值如果没有传入,则被认为是默认值。
def student_name_and_age(name, age='不愿透露'): "设置默认参数" print('姓名:%s 年龄 %s' %(name, age)) student_name_and_age('张三')
(3)可变参数:顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。这些可变参数在函数调用时自动组装为一个tuple。
def all_student_names(*names): for name in names: print('姓名:', name) all_student_names('张三','李四','王五')
(4)关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
def student_info(name, age, **kw): print(f'我的名字叫:{name},年龄:{age},其它信息:{kw}') student_info('张三', 18, height=180, city='北京')
(5)命名关键字参数:如果要限制关键字参数的名字,就可以用命名关键字参数。
def print_person_info(name, age, *, height, weight): print('我的名字叫:', name, '年龄:', age,'身高', height, '体重', weight) print_person_info('张三', 18, height=180, weight=75)
(6)参数的组合:在Python中定义函数,可以对以上5种参数进行组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
def student_info(name, age=18, *books, city, **kw): # 如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了: print('我的名字叫:', name, '年龄:', age,'其它信息:',kw) print('来自:', city) for book in books: print('我有',book,'书') student_info('张三', 18, '语文','数学','计算机', city='北京', height=180, weight=75)
高阶函数:一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数。
def func_x(x, f): return f(x) int2str = lambda x : str(x) func_x(-112, int2str)
reduce函数:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,依此类推,最后得到一个结果。
from functools import reduce mul_xy = lambda x, y: x*y # 完成累乘运算 reduce(mul_xy, [1, 3, 5, 7, 9])
print函数:格式化输出
name = 'Molly' hight = 170.4 score_math = 95 score_english = 89 print('大家好!我叫%s,我的身高是%d cm, 数学成绩%d分,英语成绩%d分' % (name, hight, score_math, score_english)) print('大家好!我叫{:s},我的身高是{:d} cm, 数学成绩{:d}分,英语成绩{}分'.format(name, int(hight), score_math, score_english)) print(f"大家好!我叫{name},我的身高是{int(hight)} cm, 数学成绩{score_math}分,英语成绩{score_english}分")
闭包:python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).
def create_pointer(my_string): def pointer(n): return my_string[n] return pointer
装饰器:函数作为返回值。顾名思义,从字面意思就可以理解,它是用来"装饰"Python的工具,使得代码更具有Python简洁的风格。换句话说,它是一种函数的函数,因为装饰器传入的参数就是一个函数,然后通过实现各种功能来对这个函数的功能进行增强。
# 装饰器输入一个函数,输出一个函数 def print_working(func): def wrapper(): print(f'{func.__name__} is working...') func() return wrapper def worker1(): print('我是一个勤劳的工作者!') worker1 = print_working(worker1) worker1()
另一种写法:
@print_working def worker1(): print('我是一个勤劳的工作者!') worker1()
偏函数:通过设定参数的默认值,降低函数调用的难度。
from functools import partial def student_info(name, age, city): print(f'我的名字叫{name}, 今年{age}岁,来自{city}') student_info_beijing = partial(student_info, city='北京') student_info_beijing('Molly',18)
二、类
私用属性和方法的定义:在属性和方法名前加 __ 两个下划线
class Athlete: def __init__(self,a_name,a_dob=None,a_times=[]): self.__name = a_name self.dob = a_dob self.times = a_times def sayName(self): print(self.__name) def top3(self): return sorted(set([self.__sanitize(t) for t in self.times]))[0:3] def __sanitize(self,time_string): if '-' in time_string: splitter = '-' elif ':' in time_string: splitter = ':' else: return (time_string) (mins,secs) = time_string.split(splitter) return (mins+'.'+secs)
子类定义:如果子类有新增的属性,那么需要在子类__init方法中,调用父类的__init__;如果子类没有新增的属性,子类不需要写__init__方法。
class Rugby(Athlete): def __init__(self,a_name,a_bod,a_squat,a_times): Athlete.__init__(self,a_name,a_bod,a_times) self.squat = a_squat def top3(self): return sorted([self.sanitize(t) for t in self.times])[-3:]
多态性:一个事物多种形态。多态的好处是:减少重复代码,分离经常改变的代码与不经常改变的代码,使得代码可维护性提高。
下面例子中print_rugby的参数athlete,athlete.name,athlete.top3()的行为由athlete的子类决定。
loren = get_coach_data('mywork/loren.txt') mark = get_coach_data('mywork/mark.txt') loren = Rugby(loren.pop(0),loren.pop(0),loren.pop(0),loren) mark = OtherAthlete(mark.pop(0),mark.pop(0),mark.pop(0),mark) def print_rugby(athlete): print(athlete.name) print(athlete.dob) print(athlete.squat) print(athlete.top3()) print_rugby(loren) print_rugby(mark)
多继承
#多个父类有相同的属性或方法名,这种情况应该避免 class Father(): def __init__(self): self.color = 'black' def talk(self): print("---爸爸的表达能力---") class Mather(): def __init__(self): self.height = 170 def smart(self): print("---妈妈聪明的头脑---") class Child(Father,Mather): def __init__(self): Father.__init__(self) Mather.__init__(self) child1 = Child() child1.talk() child1.smart() print(child1.color) print(child1.height)