1. 函数的定义:
- def func_name(参数1,2...):
- "函数底下第一行写一个str会作为函数的文档DocStrings"
- print("hello world!")
- print("hello again!")
- # 函数底下缩进一个TAB的都是函数的代码块
使用: func_name.__doc__ 即可调用函数的DocStrings,一般用作为阐述函数的功能。
2. 函数的参数传递:
参数传递有两种方式:一是值传递,将参数复制一份副本(堆和栈中都复制)传入函数内,函数内部修改的数据
实际上是复制的副本,原参数不会受到影响;
- a = [1,2,3]
- def foo(x):
- x[1] = 10
- foo(a) # 调用函数
- print(a) >> [1,2,3] 仍为原值
另一种是 引用传递 , 将参数本身传入函数中进行数据操作,只适用于 list,dict等可变量。值得注意的是,要使用引用传递,
必须要在参数中把可变量的值写进去,如果只是传入一个变量,则还是值传递:
- def foo(x):
- x.pop()
- return x
- # 引用传递
- print(foo([1,2,3])) >> [1,2]
- # 值传递
- l = [1,2,3]
- foo(l)
- print(l) >> [1,2,3] 仍为原值
函数有 5 种参数,必选参数,默认参数,可变参数,关键字参数,命名关键字参数。
必选参数,就是普通的参数。
默认参数,调用时可省略,会有一个默认值。语法是加个 = x
- def foo(a,b=2,c=3):
- pass
- # b,c 是默认参数
- def foo(*sdf):
- pass
- foo(1,2,3,3,4,4,2,32) #组成元组传入函数内
- l = [1,2,3,4]
- foo(*l) #将list每个值取出,组成元组。
可以调用时 **dict 传入字典内所有内容。
- def foo(**kw):
- pass
- foo(name="sd",age=18)
- d = {"name":"dsf","age":20}
- foo(**d)
相当于从中筛选出 name, age 两个键值对,没什么用。同时定义时,星号后的可以写成默认参数。
- def foo(a,b,*,name="pop",age=20):
- pass
- foo(a,b) # 默认值补上
- foo(a,b,name="sdf",class="ed",age=30)
- # class 被忽略
5. 全局变量
在外部创建的变量为全局变量,作用域为全部。函数内部定义的变量为局部变量,作用域仅限于函数内。如果想在函数内
使用全局变量,直接使用,但是不能赋值,由于python的创建变量机制,解释器会认为是在函数内创建一个新的变量。
解决方法 global 变量名,声明使用的是全局变量。建议定义全局变量写 g_变量名。
6. 匿名函数
- a = 21
- def foo():
- global a
- a = 30
- print(a) >> 30
适用于简单的函数(只有一行表达式的函数),用完就删。
- lambda x,y:x+y
- 冒号前为参数,冒号后为返回值
- lambda是固定语法
7. 高级函数
map: map(function, iterable)
将可迭代对象中的每一个元素都执行一次function
reduce: python3 整合进了 functools 模块,需要引入
reduce(function, iterable)
有个要求,函数是要能接受两个参数的函数。作用:将可迭代对象中的头两个元素执行函数,函数返回值和第三个元素
作为参数再执行函数,如此直到结束。
filter 过滤器,filter(function, iterable) 将函数作用于每个元素,根据返回值是True保留或者False去掉元素。返回一个生成器
sorted: 排序算法
sorted(序列,key) 将元素按ASCII码排序,返回从小到大的列表。也可加入排序规则key, key = 函数,会将每个元素
作用一次函数,得到的返回值组成一个keys列表,再对keys列表排序,最后按相应的顺序对原序列排序。