一、函数
1. 使用函数的好处
代码重用;保持一致性,易维护;可扩展性
2. 定义函数
def func(x): # def 关键字,func 函数名,x 形参(可以不传入) """ This function document""" # 函数说明 y = x+1 # 函数体 return y # 返回值 print(func(4))
3. 函数参数
位置参数、默认参数、关键字参数、参数组
def func(x, y, z=7, *args): print(args) return x+1, y*2, z**2 print(func(3, 4, 5)) # (4, 8, 25) # 位置参数:形参与实参一一对应 print(func(3, 5)) # (4, 10, 49) # 默认参数:未传入对应实参时默认使用值 print(func(x=3, z=5, y=3)) # (4, 6, 25) # 关键字参数:不需要一一对应 print(func(3, z=5, y=3)) # (4, 6, 25) # 位置参数必须在关键字参数的左边 print(func(1, 2, 3, 4, 5, 6, 7)) # 参数组:将4,5,6,7传递给 *args,可传递字典、列表 print(func(1, 2, 3, [4, 5, 6, 7])) # 参数组:传递列表 print(func(1, 2, 3, {"name": "zhangsan"})) # 参数组:传递字典
def func(x, **kwargs): print(x) print(kwargs) func(2, y=3, z=6)
def func(x, *args, **kwargs): print(x) print(args) print(kwargs) func(2, *[3, 5, 6], **{"name":"zhangsan"}) func(2, 3, 5, 6, y="34", z=34)
4. 函数返回值
(1)无返回值
def func(): """ """ pass # 无返回值时默认返回 None
(2)一个返回值
def func(x): """ """ return x+1 # 一个返回值时返回对应的Object
(3)多个返回值
def func(x): """ """ return x+1, x*2, x**2 # 多个返回值时返回一个元组 print(func(3)) # (4, 6, 9)
5. 函数作用域
def func(): print("func") def func2(): print("func2") return func # 返回func在内存中的地址 res = func2() print(res) print(res())
二、局部变量和全局变量
name = "zhangsan" # 全局变量 def func(): # name = "lisi" # 局部变量:只在函数内部起作用 global name # 引入全局变量,若没有global,优先读取局部变量,没有则读全局变量(只能读,不能修改) name = "哈哈" func() print(name)
三、递归函数
在一个函数内部调用函数自身,则为递归函数。
特性:
(1)必须有一个明确的结束条件
(2)每进入一次递归,问题规模相比上一次都应该有所减少
(3)递归效率不高,递归层次过多会导致栈溢出
# 示例 def func(n): print(n) if int(n/2) == 0: return n return func(int(n/2)) func(10)
四、匿名函数
func = lambda x: x+1 # 匿名函数:关键字lambda,x为形参,x+1为返回值 print(func(10)) func1 = lambda x, y: x if x > y else y print(func1(67, 3)) func2 = lambda x, y, z: (x+1, y*2, z**2) print(func2(7, 3, 4))
五、函数式编程
1. 特性:
(1)不可变:不用变量保存状态,不修改变量(没有任何赋值操作)。
扫描二维码关注公众号,回复:
2541547 查看本文章
(2)第一类对象:函数即变量,函数名可以当做参数传递,也可以当做返回值。
(3)尾调用:在函数的最后一步调用另一个函数(最后一步不一定是最后一行)。
六、高阶函数
高阶函数:一个函数接收另一个函数作为形参,或者一个函数把另一个函数当做返回值返回,那么这个函数就称为高阶函数。
def foo(n): return n*2 def foo1(n): print(n) foo1(foo(2)) # 把函数当做参数传递给另一个函数 def foo2(): return foo # 把函数当做返回值 n = foo2() print(n(3))
七、常用内置函数
print(abs(-6)) # 求绝对值 print(all([34, 4, -1, 3])) # 判断可迭代对象的所有元素是否都为True print(bin(4)) # 返回整数的二进制 # 空、None、0 的bool值为false print(bool("")) print(bytes("你好", encoding="utf-8")) # 转换成字节 print(chr(98)) # 返回整数对应的字符 print(dict(a='a', b='b', t='t')) # 创建一个字典 # 把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b),可用于分页处理 print(divmod(10, 3)) # 用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标 print(list(enumerate(["苹果", "香蕉", "梨"]))) # 不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表 print(dir()) # 执行一个表达式,并返回结果;把字符串的表达式进行运算 print(eval('pow(2,3)')) print(eval("3+4*(6-2)")) print(hash('test')) # 获取一个对象(不可变数据类型)的hash值
1. map()
根据提供的函数对指定序列做映射。
def square(n): return n**2 res = map(square, [1, 2, 3, 4, 5]) for i in res: print(i, end=", ") print() res = map(lambda x:x**2, [1, 2, 3, 4, 5, 6]) print(list(res))
2. filter()
过滤序列,过滤掉不符合条件的元素,符合条件的元素组成一个新的列表返回(Python 2.7返回列表,Python3返回迭代器对象)。
def is_odd(n): return n % 2 == 1 newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) print(list(newlist))
3. reduce()
from functools import reduce # reduce() 在 Python3 已被移除到 functools 模块 def add(x, y) : # 两数相加 return x + y # 必须传入有两个参数的函数,将前两个元素的执行结果和第三个元素作为参数传递给函数 print(reduce(add, [1, 2, 3, 4, 5]))