函数
定义:完成特定功能的语句组,可以给这组语句取一个名字,作为一个单位使用。
函数优点
实现代码复用,提高开发效率,减少重复编码。
简化程序结构,将复杂的编程问题分解为若干简单的子问题,每个子问题由函数来解决。
使用函数可以使程序更容易阅读;使调试测试更容易。
信息封装与隐藏。
函数定义
def funcname(params):
xxx
xxx
return xxx
函数名、参数、函数体
匿名函数
f = lambda 参数1, 参数2, ... :表达式
f = lambda x,y,z : x+y+z
g = lambda x: lambda y : x+y
>>>f=lambda x,y,z:x+y+z
>>>f(5,10,15)
30
>>>g=lambda x:lambda y:x+y
>>>g(5)(10)
15
带默认参数值的匿名函数
f = lambda x,y=3 : x**y
f(2,2) = 4
f(2) = 8
参数传递
1 按照位置传参数
2 按照关键字传参数
3 按照默认值传参数
函数定义时如果指定默认值参数,这类参数必须放在无默认值参数的后面。
def sum(a,b,c=10)
return a+b+c
sum1 = sum(4,5,6)
sum2 = sum(a=4,c=8,b=6)
可变数量的参数定义
定义函数时,如果参数数量不确定,可以定义可变数量的参数。
参数名前面加一个'*'表示参数是以形参名为标志符的元组,元组中的元素个数可以是零个、一个或多个。
参数名前加两个'*'表示参数数据类型是字典,其中参数名为“key”,参数值为“value”
定义函数时,可以混合使用多种参数传递方式,要遵循如下规则:
1 关键字参数放在位置参数后面
2 元组参数放在关键字参数后面
3 字典参数放在元组参数后面
调用函数时,首先按位置顺序传递参数,其次按关键字传递参数。多余的非关键字参数传递给元组,多余的关键字参数传递给字典。
函数返回值
函数定义中,return语句是可选项,主要功能是返回函数执行结果。
返回的数据类型除常见的数值,字符串,还可以是布尔值、列表对象等。
当有多条return语句时,执行第一条return语句就会退出函数,不再执行return后面的语句。
如果函数没有return语句,自动返回None,表示没有返回值。
return语句可以返回多个值,此时实际上返回的是一个元组对象。
变量作用域
函数内部创建的对象只能在函数内部访问,这种变量称为局部变量。
函数外部定义的变量可以被程序的任何部分访问,这种变量称为全局变量。
Python3中全局变量在函数内访问时需要用global指明是访问全局变量。
常用内建函数
dir函数
返回由给定模块、类、实例,或其他类型的所有成员组成的列表,在交互式python解释器下很有用,也可以用在其他地方。
help函数
启动内置的帮助系统(此函数主要在交互式中使用)。如果没有实参,解释器控制台里会启动交互式帮助系统。如果实参是一个字符串,则在模块、函数、类、方法、关键字或文档主题中搜索该字符串,并在控制台上打印帮助信息。如果实参是其他任意对象,则会生成该对象的帮助页。
open函数
打开file 并返回对应的file object。如果该文件不能打开,则触发OSError。
len函数
返回对象的长度(元素个数)。实参可以是序列(如 string、bytes、tuple、list 或 range 等)或集合(如 dictionary、set 或 frozen set 等)。
sum(iterable[,start])
从start 开始自左向右对iterable 中的项求和并返回总计值。start 默认为0。iterable 的项通常为数字,开始值则不允许为字符串。
sorted(iterable,*,key=None,reverse=False)
根据iterable 中的项返回一个新的已排序列表。
具有两个可选参数,它们都必须指定为关键字参数。
key 指定带有单个参数的函数,用于从iterable 的每个元素中提取用于比较的键 (例如key=str.lower)。默认值为None (直接比较元素)。
reverse 为一个布尔值。如果设为True,则每个列表元素将按反向顺序比较进行排序。
使用functools.cmp_to_key()可将老式的cmp 函数转换为key 函数。
内置的sorted()确保是稳定的。如果一个排序确保不会改变比较结果相等的元素的相对顺序就称其为稳定的 --- 这有利于进行多重排序(例如先按部门、再按薪级排序)。
filter(function,iterable)
用iterable 中函数function 返回真的那些元素,构建一个新的迭代器。iterable 可以是一个序列,一个支持迭代的容器,或一个迭代器。如果function 是None ,则会假设它是一个身份函数,即iterable 中所有返回假的元素会被移除。
max(iterable,*[,key,default])
max(arg1,arg2,*args[,key])
返回可迭代对象中最大的元素,或者返回两个及以上实参中最大的。
如果只提供了一个位置参数,它必须是非空iterable,返回可迭代对象中最大的元素;如果提供了两个及以上的位置参数,则返回最大的位置参数。
有两个可选只能用关键字的实参。key 实参指定排序函数用的参数,如传给list.sort()的。default 实参是当可迭代对象为空时返回的值。如果可迭代对象为空,并且没有给default ,则会触发ValueError。
如果有多个最大元素,则此函数将返回第一个找到的。
map(function,iterable,...)
返回一个将function 应用于iterable 中每一项并输出其结果的迭代器。如果传入了额外的iterable 参数,function 必须接受相同个数的实参并被应用于从所有可迭代对象中并行获取的项。当有多个可迭代对象时,最短的可迭代对象耗尽则整个迭代就将结束。
range(stop)
range(start,stop[,step])
虽然被称为函数,但range实际上是一个不可变的序列类型,通常用于在for循环中循环指定的次数。
range构造器的参数必须为整数(可以是内置的int或任何实现了__index__ 特殊方法的对象)。如果省略step 参数,其默认值为1。如果省略start 参数,其默认值为0, 如果step 为零则会引发ValueError。
如果step 为正值,确定 range r 内容的公式为r[i] = start + step*i 其中i >= 0 且r[i] < stop。
如果step 为负值,确定 range 内容的公式仍然为r[i] = start + step*i,但限制条件改为i >= 0 且r[i] >stop.
range类型相比常规list或tuple的优势在于一个range对象总是占用固定数量的(较小)内存,不论其所表示的范围有多大(因为它只保存了start,stop和step 值,并会根据需要计算具体单项或子范围的值)。
enumerate(iterable,start=0)
返回一个枚举对象。iterable 必须是一个序列,或iterator,或其他支持迭代的对象。enumerate()返回的迭代器的__next__()方法返回一个元组,里面包含一个计数值(从start 开始,默认为 0)和通过迭代iterable 获得的值。
input([prompt])
如果存在prompt 实参,则将其写入标准输出,末尾不带换行符。接下来,该函数从输入中读取一行,将其转换为字符串(除了末尾的换行符)并返回。
print(*objects,sep=' ',end='\n',file=sys.stdout,flush=False)
将objects 打印到file 指定的文本流,以sep 分隔并在末尾加上end。sep,end,file和flush 如果存在,它们必须以关键字参数的形式给出。
所有非关键字参数都会被转换为字符串,就像是执行了 str() 一样,并会被写入到流,以sep 且在末尾加上end。sep 和end 都必须为字符串;它们也可以为None,这意味着使用默认值。如果没有给出objects,则 print() 将只写入end。
file 参数必须是一个具有write(string) 方法的对象;如果参数不存在或为None,则将使用 sys.stdout。 由于要打印的参数会被转换为文本字符串,因此 print() 不能用于二进制模式的文件对象。对于这些对象,应改用file.write(...)。
输出是否被缓存通常决定于file,但如果flush 关键字参数为真值,流会被强制刷新。