1: 函数
(1): 函数定义的格式
- 函数的说明文档,解释说明函数的作用
def 函数名 (参数) 代码1 代码2
(2): 定义函数的说明文档
def 函数(参数) """函数说明文档""" 代码
- 查看函数的说明文档
help (函数名)
(3): 函授的变量
- 全局变量 : 生命全局变量的关键字是:global
- 函数体内和函数体外都生效的变量。
- 局部变量
(4): 函数的返回值
return 变量值1,变量值2
:返回多个数据的时候,默认是元祖数据类型- return 后面可接:列表,元祖或者字典, 已返回多个值。
(5): 函数的传参
位置参数
- 调⽤用函数时根据函数定义的参数位置来传递参数
- 传递和定义参数的顺序及个数必须⼀一致
def function(name, age, grade) print() #调用 function('wang', 18, 三)
关键字参数
函数调⽤用,通过“键=值”形式加以指定。可以让函数更更加清晰、容易易使⽤用,同时也清除了了参数的顺序需求。
- 函数调⽤用时,如果有位置参数时,位置参数必须在关键字参数的前⾯面,但关键字参数之间不不存在
先后顺序def user_info(name, age, gender): print(f'您的名字是{name}, 年年龄是{age}, 性别是{gender}') user_info('Rose', age=20, gender='⼥女女') user_info('⼩小明', gender='男', age=16)
缺省参数
- 默认参数: 在函数定义时, 首先进行了参数值的赋予。
- 函数调⽤用时,如果为缺省参数传值则修改默认参数值;否则使⽤用这个默认值
不定长参数
不不定⻓长参数也叫可变参数。⽤用于不不确定调⽤用的时候会传递多少个参数(不不传参也可以)的场景。此时,可0⽤用包裹(packing)位置参数,或者包裹关键字参数
def function2(* arg)
: 调用函数: function2(‘wang’, 18) function2([1,2], ‘wangyong’, 18) 都可以参数不固定传进的所有参数都会被args变量量收集,它会根据传进参数的位置合并为⼀一个元组(tuple),args是元组类型,这就是包裹位置传递
包裹关键字传递
def user_info(**kwargs): print(kwargs) # {'name': 'TOM', 'age': 18, 'id': 110} user_info(name='TOM', age=18, id=110)
无论是包裹位置传递还是包裹关键字传递,都是⼀一个组包的过程
2:拆包和交换变量
(1): 对元组合字典进行拆包
元组:拆包
def return_num(): return 100, 200 num1, num2 = return_num() print(num1) # 100 print(num2) # 200
拆包: 字典
dict1 = {'name': 'TOM', 'age': 18} a, b = dict1
对字典进⾏行行拆包,取出来的是字典的key
print(a) # name
print(b) # age
print(dict1[a]) # TOM
print(dict1[b]) # 18
3: 引用
- 我们可以⽤用 id() 来判断两个变量量是否为同⼀一个值的引⽤用。 我们可以将id值理理解为那块内存的地址标识。
# 1. int类型 a = 1 b = a print(b) # 1 print(id(a)) # 140708464157520 print(id(b)) # 140708464157520 a = 2 print(b) # 1,说明int类型为不不可变类型 print(id(a)) # 140708464157552,此时得到是的数据2的内存地址 print(id(b)) # 140708464157520 # 2. 列列表 aa = [10, 20] bb = aa print(id(aa)) # 2325297783432 print(id(bb)) # 2325297783432 aa.append(30) print(bb) # [10, 20, 30], 列列表为可变类型 print(id(aa)) # 2325297783432 print(id(bb)) # 2325297783432 # 去分析一下其他的数据类型
4:数据类型的 variable 和 not variable
- 所谓可变类型与不不可变类型是指:数据能够直接进⾏行行修改,如果能直接修改那么就是可变,否则是不不可变
- 可变的数据类型
- 列表[ ],字典{ }, 集合{ }
- not variable
- 整型,浮点型,字符串,元组( )
5: lambda
(1) : lambda 的语法
lambda 参数列列表 : 表达式 (参数传值)
- lambda表达式的参数可有可⽆无,函数的参数在lambda表达式中完全适⽤用
- lambda函数能接收任何数量量的参数但只能返回⼀一个表达式的值
- 直接打印 lambda 的值为地址, 打印 lambda( ) : 为传出的参数值。
(2): lambda 的参数传递形式
- 无参数
print((lambda: 100)())
- 一个参数
print((lambda a : a)(hello world))
- 默认参数
print((lambda a, b, c=100: a+b+c)(10,20))
- 可变参数
print(lambda * args : args)(10, 20, 30)
- 这里的可变参数传入到 lambda 之后, 返回值是元组
- 可变参数 : ** kwargs
print((lambda ** kwargs : kwargs)(name='python', age=20))
(3): lambda 的简单应用
三目元算符
print((lambda a, b: a if a > b else b)(1000, 3000))
列表数据, 按字典 Key 值排序
students = [ {'name': 'TOM', 'age': 20}, {'name': 'ROSE', 'age': 19}, {'name': 'Jack', 'age': 22} ] # 按name值升序排列列 students.sort(key=lambda x: x['name']) print(students) # 按name值降序排列列 students.sort(key=lambda x: x['name'], reverse=True) print(students) # 按age值升序排列列 students.sort(key=lambda x: x['age']) print(students)
6: 高阶函数
把函数作为参数传入,这样的函数称为高阶函数。
高阶函数就是函数式编程的提现。
函数数编程就是指这种高度抽象的编程范式。
abs(-10) # 10 : 是用来求数值的绝对值的
普通
def sum_num(a,b)
return abs(a) + abs(b)函数式
def sum_num(a, b, f):
return f(a) + f(b)
result = sum_num(-1, 2, abs)
print(result) # 3#对比:函数式编程⼤大量量使⽤用函数,减少了了代码的重复,因此程序⽐比较短,开发速度较快
- 内置的高阶函数
- map(func, lst),将传⼊入的函数变量量func作⽤用到lst变量量的每个元素中,并将结果组成新的列列表(Python2)/迭代器器(Python3)返回
- reduce(func(x,y),lst),其中func必须有两个参数。每次func计算的结果继续和序列列的下⼀一个元素做累积计算。
- reduce()传⼊入的参数func必须接受2个参数
- filter(func, lst)函数⽤用于过滤序列列, 过滤掉不不符合条件的元素, 返回⼀一个 filter 对象,。如果要转换为列列表,可以使⽤用 list() 来转换
- 递归函数(not relations)
- 条件
- 函数本身进行自己调用
- 函数必须有出口