内置函数
前面已经学习了很多内置(built-in)函数和类型
函数的声明和调用
def 函数名(形参):
...
return
- 尽量不要和内置函数重名 特别是内建类(str,int,list...)
- return 语句不写默认返回
None
- return 语句接多个表达式会返回为元组
- 可以使用 pass 语句占位(有时候使用 3 个小数点这同时是特殊的变量)
传递实参
# 位置参数,一一对应
foo(1, 2, 3)
# 关键字参数
foo(a=1, b=2, c=3)
# 混合使用时,位置参数要先占坑
注意
给形参传递实参相当于是直接赋值,对于可变类型来讲相当于起别名。
这会导致定义的函数可能不是纯函数(所传递进去的原列表字典等参数可以被影响)
可以使用(深)拷贝等方法在操作引用类型时达到纯函数的效果
默认参数
# 必传的参数 要在 有默认值的参数 之前
def foo(a, b, c=None):
pass
注意
在 python 中,默认参数不能是其他形参构成的表达式。(不要:def f(a, b=len(a)):
)
在 python 中,参数所在的小括号并不属于函数命名空间也不是独立的块作用域,
所以不要使用默认参数来初始化空列表和空字典。
即不要:def f(a, b=[]):pass
除非是只会执行一次的函数如类方法__init__
一般可以用def f(a, b=None):
和if b is None: b = []
来初始化列表
剩余参数
*元组
(不限于元组), **字典
接收
def bar(*args, **kwargs):
print(args)
print(kwargs)
bar(1, 2, 3, 4, x=5)
# (1, 2, 3, 4)
# {'x': 5}
调用
def foo(a, b, c):
print(a)
print(b)
print(c)
# 剩余的参数由列表填充(位置参数)
foo(1, *[2, 3])
# 1
# 2
# 3
# 剩余的参数由字典填充(关键字参数)
foo(1, **{"b": 2, "c": 3})
# 1
# 2
# 3
# 混合使用时,要先由*列表填充再用**字典填充
foo(
*(
1,
2,
),
**{"c": 3},
)
# 1
# 2
# 3
在 python3.8 中新增使用/
和*
分割的用法:
强制限制函数的参数只允许以位置参数或者关键字参数的方式传入。/
之前的参数必须是位置参数,*
之后的参数必须是关键字参数
匿名函数
return 冒号右边的语句的返回值
lambda x: x + 1
匿名函数作为参数:以 list.sort
的 key
为例
# list.sort(~cmp=None~, key=None, reverse=False)
>>> lst = ['3','14','72','108']
>>> lst.sort()
>>> lst
['108', '14', '3', '72']
>>> lst.sort(key = lambda x:int(x))
>>> lst
['3', '14', '72', '108']
函数式编程
- 不可变:不用变量保存状态,不修改变量
- 第一类对象:函数即变量
高阶函数
map()
filter()
reduce()
是最常见的 3 个高阶函数
Py3 里 reduce()
被收入了functools
模块中
Py2 中 filter()
reduce()
返回的是列表, 而 Py3 中返回到是一个迭代器。
其上实现了 __iter__
和 __next__
方法故而可直接用于for in
语句。
也可以用list()
函数将迭代器转为列表(不限于列表)。
# 计算列表各个元素的平方
list(map(lambda x: x**2, [1, 2, 3, 4, 5]))
# [1, 4, 9, 16, 25]
# 提供了两个列表,对相同位置的列表数据进行相加
list(map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10]))
# [3, 7, 11, 15, 19]
# 过滤出列表中的所有奇数:
def is_odd(n):
return n % 2 == 1
list(filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
# [1, 3, 5, 7, 9]
# 使用reduce记录词频:
from functools import reduce
def statistics(dic, k):
if not k in dic:
dic[k] = 1
else:
dic[k] += 1
return dic
lst = [1, 1, 2, 3, 2, 3, 3, 5, 6, 7, 7, 6, 5, 5, 5]
reduce(statistics, lst, {})
# {1: 2, 2: 2, 3: 3, 5: 4, 6: 2, 7: 2}
其他内置函数
罗列了(包含前面已经学过的)内置函数,
由于 python 版本的差异可能有弃用的参数 所以每一个函数请自己尝试一次。
文件处理
open()
打开一个文件,返回一个文件操作符(文件句柄)
操作文件的模式有r,w,a,r+,w+,a+
共 6 种
每一种方式都可以用二进制的形式操作(rb,wb,ab,rb+,wb+,ab+
)
可以用encoding=指定编码
。
作用域相关
globals()
——获取全局变量的字典locals()
——获取执行本方法所在命名空间内的局部变量的字典
控制台相关
input()
输入print()
输出print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
- file: 默认是输出到屏幕,如果设置为文件句柄,输出到文件
- sep: 打印多个值之间的分隔符,默认为空格
- end: 每一次打印的结尾,默认为换行符
- flush: 立即把内容输出到流文件,不作缓存
内存相关
id(o)
o 是参数,返回一个变量的内存地址hash(o)
o 是参数,返回一个可 hash 变量的哈希值,不可 hash 的变量被 hash 之后会报错。
帮助方法
在控制台执行help()
进入帮助模式。可以随意输入变量或者变量的类型。输入 q 退出
或者直接执行help(o)
,o 是参数,查看和变量 o 有关的操作。。。
和调用相关
callable(o)
,o 是参数,看这个变量是不是可调用。如果o(...)
可以被执行,就会返回True
和数字相关
数据类型相关:bool,int,float,complex
进制转换相关:bin,oct,hex
数学运算:abs,divmod,min,max,sum,round,pow
abs() # 绝对值 复数的模
bin() # 十进制转二进制
hex() # 十进制转十六进制
oct() # 十进制转八进制
bool() # 转布尔类型
max(list) # 可迭代对象内部逐位比较 最大
min(list) # 可迭代对象内部逐位比较 最小
max(list, key=lambda dic: dic["keyname"]) # 元素之间比较
pow(a, b) # 相当于a**b
pow(a, b, c) # 相当于a**b%c
round(num) # 四舍五入
divmod(被除数, 除数) # 返回元组:(商,余数)
和数据结构相关
列表和元组相关的:list 和 tuple
字符串相关的:str,format,bytes,bytearry,memoryview,ord,chr,ascii,repr
序列:reversed,slice
字典和集合:dict,set,frozenset
数据集合:len,sorted,enumerate,all,any,zip,filter,map
bytes(s, encoding="utf-8") # 编码
s.decode("utf-8") # 解码(已废弃,直接用str(s,'utf-8'))
chr(int) # 数字转asc字符
ord(char) # 字符转asc码
slice(start, stop, step) # 切片对象
reversed(list) # 临时翻转
sorted(list, key=..., reverse=...) # 临时排序 本质是比较大小
# 与list.sort基本一致 python3key传functools.cmp_to_key(cmp)参数
zip(list1, list2) # 拉链 返回若干小元组(list1[0],list2[0])
enumerate() # 函数用于将一个可遍历的数据对象(如列表、元组或字符串)
# 组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
all() # 是否所有元素都为真 空容器也为真
any() # 是否存在元素为真
模块操作相关
__import__(str)
导入模块
类型相关
type(o)
元类。返回变量 o 的数据类型
type(1) == int
可以判断类型
isinstance(o, cls)
判断是否符合类型
isinstance(True, int)
可以判断类型包括子类(bool 是 int 子类)
......
在学完面向对象之后补充与面向对象有关的内置方法
其他
dir()
属性展开eval()
/ exec()
将字符串当做 python 代码执行 不推荐使用vars(obj)
查看对象下所有方法返回为字典 若无参数相当于locals()