文章目录
一、 函数
在交互式命令行通过help(函数名)
查看函数的帮助信息
1 基本函数
-
print()
函数print()
print会依次打印每个字符串,遇到逗号“,”会输出一个空格,print自动换行
-
input()
函数input()
,input输入的是str
类型的a = input('name:')
会输出提示信息 -
int()
函数数据类型转换,将str转换为整数
例:
b = int(s)
-
abs
函数求绝对值
-
max()
函数可以接收任意多个参数,并返回最大的
-
hex()
函数把一个整数转换成十六进制表示的字符串
-
range()
函数可以生成一个整数序列,从0开始生产
list()
函数可以转换为listprint(list(range(5)))
-
isinstance
函数可以判断一个变量是不是什么
isinstance(x, ...)
-
sum函数
可以直接求和
2 定义函数
-
使用
def
语句,依次写出函数名、括号、括号中的参数和冒号:
-
在缩进块中编写函数体,函数的返回值用
return
语句返回例
def my_abs(x):
(1)定义一个空函数:
用pass
语句
例:def nop():
pass
(2)函数的参数
1.位置参数:
-
调用函数时,传入的两个值按照位置顺序依次赋给参数
例:
def power(x):
2.默认参数:
-
必选参数在前,默认参数在后
-
当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数
-
可以按顺序提供默认参数
-
可以不按顺序提供部分默认参数,但需将参数名加上
默认参数必须指向不变对象
例:
def enroll(name, gender, age=6, city='Beijing'):
3.可变参数:
-
*args
是可变参数,args接收的是一个tuple -
*nums
表示把nums
这个list的所有元素作为可变参数传进去 -
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple
-
可变参数既可以直接传入:
func(1, 2, 3)
,又可以先组装list或tuple,再通过*args
传入:func(*(1, 2, 3))
例:
def calc(*numbers):
4.关键字参数:
-
**kw
是关键字参数,kw接收的是一个dict -
关键字参数允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
-
可以扩展函数的功能
-
函数的调用者可以传入任意不受限制的关键字参数
-
关键字参数既可以直接传入:
func(a=1, b=2)
,又可以先组装dict,再通过**kw
传入:func(**{'a': 1, 'b': 2})
。例:
def person(name, age, **kw):
5.命名关键字参数
- 命名的关键字参数是为了限制关键字参数,同时可以提供默认值(可以有缺省值)。
*
后面的是命名关键字参数,如果已经有了可变参数,就不需要再加一个*
- 命名关键字必须传入参数名
- 每一个命名关键字参数都必须有值
- 定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符
*
,否则定义的将是位置参数。
6.参数组合
- 参数定义的顺序必须是:位置参数、默认参数、可变参数(
*
)、命名关键字参数(*
)和关键字参数(**
)
(3)参数检查
数据类型检查可以用内置函数isinstance()
实现
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
(4)返回多个值(返回tuple)
Python的函数返回多值其实就是返回一个tuple
返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值
二、高级特性
1、切片
L[起始索引:结束索引:间隔大小]
,若第一个索引为0,可省略;若间隔大小为1,可省略;可以全部省略,则为复制
L[0:3]
:0 <= L < 3 (不包含3)
可对list、tuple、字符串进行切片,灵活
支持倒数切片
2、迭代Iteration
for
循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)
在Python中,迭代是通过for ... in
来完成的
dict的储存不是按照list的方式顺序排列的,迭代出的结果顺序可能不一样
dict
迭代:
- 默认情况下,dict迭代的是key
- 如果要迭代value,可以用
for value in d.values()
- 如果要同时迭代key和value,可以用
for k, v in d.items()
。
如何判断一个对象是可迭代对象呢?
方法是通过collections模块的Iterable
类型判断:
from collections import Iterable
isinstance('abc', Iterable)
Python内置的enumerate
函数可以把一个list变成索引-元素对,这样就可以在for
循环中同时迭代索引和元素本身:
for i, value in enumerate(['A', 'B', 'C']):
print(i, value)
任何可迭代对象都可以作用于for
循环,包括我们自定义的数据类型,只要符合迭代条件,就可以使用for
循环
3、列表生成式
用来创建list的生成式
for循环创建list的生成式
[x * x for x in range(1, 11)]
4、生成器generator
这种一边循环一边计算的机制,称为生成器:generator
- 创建一个generator
- 1、方法很简单,只要把一个列表生成式的
[]
改成()
- 2、函数定义中包含
yield
关键字,那么这个函数是一个generator
- 1、方法很简单,只要把一个列表生成式的
generator的函数,在每次调用next()
的时候执行,遇到yield
语句返回,再次执行时从上次返回的yield
语句处继续执行
-
调用
调用generator时,首先要生成一个generator对象,然后用
next()
函数不断获得下一个返回值 -
返回值
用
for
循环调用generator时,发现拿不到generator的return
语句的返回值。如果想要拿到返回值,必须捕获StopIteration
错误,返回值包含在StopIteration
的value
中: -
结束
对于函数改成的generator来说,遇到
return
语句或者执行到函数体最后一行语句,就是结束generator的指令,for
循环随之结束。
5、迭代器Iterator
-
可以直接作用于for循环的数据类型有:
- list、tuple、dict、set、str
- generator(包括生成器和带yield的函数)
-
可以直接作用于
for
循环的对象统称为可迭代对象:Iterable
-
可以使用
isinstance()判断一个对象是否是Iterable对象
-
from collections import Iterable
例:
from collections import Iterable
isinstance([], Iterable)
-
-
被
next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
-
可以使用
isinstance()
判断一个对象是否是Iterator
对象例:
from collections import Iterator
isinstance((x for x in range(10)), Iterator)
-
-
使用
iter()
把list、dict、str
等Iterable
变成Iterator
三、函数式编程
1、高阶函数
函数就是面向过程的程序设计的基本单元
函数本身也可以赋值给变量,即:变量可以指向函数
函数名其实就是指向函数的变量
高阶函数:一个函数就可以接收另一个函数作为参数
-
map/reduce
-
map(两个参数)
map函数接受两个参数,一个函数,一个是
Iterable
,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterable
放回Iterator
是惰性序列,通过list()
函数让它把整个序列都计算出来并返回一个list -
reduce(两个参数)
把一个函数作用在一个序列
[x1,x2,x3,x4......]
上这个函数必须接受两个参数,reduce把结果继续和下一个元素做累计计算
reduce(f,[x1,x2,x3,x4]) = f(f(f(x1,x2),x3),x4)
-
-
filter:过滤序列(两个参数)
接收一个函数与一个序列,与map类似依次作用于每个元素,但根据返回值确定是否丢弃元素
返回值也是一个Iterator(惰性序列),需要list函数获取结果并返回list
-
sorted:排序算法(三个参数)
可以接收一个key函数来实现自定义的排序
例:
sorted([3,65,3,4],key=abs)
忽略大小写:
sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
进行反向排序,传入第三个参数
reverse=True
sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
2、返回函数
相关参数和变量都保存在返回的函数中,称为“闭包”
每次调用互不影响
返回的函数不会立刻执行
返回函数不要引用任何循环变量,或者后续会发生变化的变量,如果使用的话,多次调用的结果会相同
3、匿名函数(lambda
)
关键字lambda
表示匿名函数,冒号前面的x表示函数参数
list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
匿名函数只能有一个表达式,不用写return,返回值就是该表达式的结果
匿名函数不会冲突
匿名函数也是一个函数对象,可以把匿名函数赋值给一个变量,也可以吧匿名函数作为返回值返回
def build(x, y): return lambda: x * x + y * y
4、装饰器(@
)
在代码运行期间增加功能的方式,称为“装饰器”(Decorator)
函数有一个__name__
可以拿到函数的名字
functools.wrap
<==>wrapper.__name__ = func.__name__
(交换函数签名)
一个完整的decorator:
import functools
def log(func):
@functools.warps(func)
5、偏函数(functools.partial
)
偏函数(Partial function):把一个函数的某些参数固定
functools.partial
创建一个偏函数,给一个函数设定默认参数(在函数调用的时候也可以传入其他值),返回一个新函数
int2 = functools.paratial(int,base=2)
创建偏函数的时候,可以接收函数对象
、*args
、**kw
四、 模块
作用域
- 公开(public):正常的函数和变量名,可以被直接引用
- 特殊变量:
__xxx__
,定义自己的变量一般不用 - 私有(private):
_xxx
和__xxx
,不应该直接引用private函数