函数
1. 函数
目的:函数在开发过程中,可以更高效的实现代码重用
1.1 函数定义
语法:
def 函数名(参数):
"""函数说明文档""" #查看说明文档, help(函数名)
代码......
-
函数的参数:函数调用的时候可以传入真实数据,增大函数的使用的灵活性
- 形参:函数定义时书写的参数(非真实数据)
- 实参:函数调用时书写的参数(真实数据)
- 传递和定义参数的顺序及个数必须一致。
- 函数调用,通过“键=值”形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。
- 缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值
- 不定长参数也叫可变参数。用于**不确定调用的时候会传递多少个参数(不传参也可以)的场景。**此时,可用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会显得非常方便。
-
包裹位置传递
def name(*args): print(args) name('Dave') name('Dave', 19) """ ('Dave',) ('Dave', 19) """
- 传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是包裹位置传递。
-
包裹关键字传递
def keys(**kwargs): print(kwargs) keys(name = 'Dave', nation = 'China', age = 18) # {'name': 'Dave', 'nation': 'China', 'age': 18}
-
-
函数的返回值
- 作用:函数调用后,返回需要的计算结果
- 写法
return 表达式
return a, b
写法,返回多个数据的时候,默认是元组类型。- return后面可以连接列表、元组或字典,以返回多个值。
-
函数的说明文档
- 作用:保存函数解释说明的信息
- 写法
def 函数名(): """ 函数说明文档 """
-
函数嵌套调用:一个函数内部嵌套调用另外一个函数
2. 变量的作用域
变量作用域指的是变量生效的范围,主要分为两类:
- 局部变量:是定义在函数体内部的变量,即只在函数体内部生效。在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量。
- 全局变量:指的是在函数体内、外都能生效的变量。
- 如何在函数体内部修改全局变量?
-
global 关键字声明该是全局变量
-
实例:
a = 100 def add1(a, b): global a # global 关键字声明a是全局变量 a = 200 return a + b
-
- 如何在函数体内部修改全局变量?
3. 拆包
- 拆包:元组
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
4. 引用
-
概论:在python中,值是靠引用来传递来的。
-
**可以用
id()
来判断两个变量是否为同一个值的引用。**可以将id值理解为那块内存的地址标识。# 1. int类型 a = 1 b = a print(b) # 1 print(id(a)) # 140708464157520 print(id(b)) # 140708464157520
5. 可变与不可变类型
是指:数据能够直接进行修改,如果能直接修改那么就是可变,否则是不可变.
- 可变类型
- 列表
- 字典
- 集合
- 不可变类型
- 整型
- 浮点型
- 字符串
- 元组
6. lambda 表达式
-
lambda
- 语法
lambda 参数列表: 表达式
-
特点:
- lambda表达式的参数可有可无,函数的参数在lambda表达式中完全适用。
- lambda表达式能接收任何数量的参数但只能返回一个表达式的值。
- 直接打印lambda表达式,输出的是此lambda的内存地址
-
lambda的参数形式
-
无参数
lambda: 表达式 fn1 = lambda: 1111 print(fn1()) # 1111
-
一个参数
lambda 参数: 表达式 f3 = lambda a : a print(f3('hello world!')) # hello world! print(f3(122)) # 122
- 默认参数
lambda key=value: 表达式 fn1 = lambda a, b, c=100: a + b + c print(fn1(10, 20)) # 130
- 不定长位置参数
lambda *args: 表达式 # 这里的可变参数传入到lambda之后,返回值为元组。 fn1 = lambda *args: args print(fn1(10, 20, 30))
- 不定长关键字参数
lambda **kwargs: 表达式 fn1 = lambda **kwargs: kwargs print(fn1(name='python', age=20))
-
-
带判断的lambda
fn1 = lambda a, b: a if a > b else b print(fn1(1000, 500))
-
列表数据按字典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)
-
高阶函数
-
作用:把函数作为参数传入,化简代码
def sum_num(a, b, f): return f(a) + f(b) result = sum_num(-1, 2, abs) print(result) # 3
-
内置高阶函数
-
map():map(func, lst),将传入的函数变量func作用到lst变量的每个元素中,并将结果组成新的列表(Python2)/迭代器(Python3)返回。
list1 = [1, 2, 3, 4, 5] def func(x): return x ** 2 result = map(func, list1) print(result) # <map object at 0x0000013769653198> print(list(result)) # [1, 4, 9, 16, 25]
-
reduce():reduce(func,lst),其中func必须有两个参数。每次func计算的结果继续和序列的下一个元素做累积计算。
- reduce()传入的参数func必须接收2个参数。
#计算`list1`序列中各个数字的累加和。 import functools list1 = [1, 2, 3, 4, 5] def func(a, b): return a + b result = functools.reduce(func, list1) print(result) # 15
-
filter():filter(func, lst)函数用于过滤序列, 过滤掉不符合条件的元素, 返回一个 filter 对象。如果要转换为列表, 可以使用 list() 来转换。
-
-