函数的封装解构
Posted pythonerLau
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数的封装解构相关的知识,希望对你有一定的参考价值。
函数的定义:
数学定义函数: y=f(x),y是x的函数,x是自变量
函数的作用:
为了复用,简单易懂
函数分类:
内建函数,如max(),reversed()
库函数,如math.ceil()等
利用def语句定义函数:
def 函数名(型参列表):
函数体(代码块)
[return 返回值]
函数名是标识符,命名要求一样,要求【见名知义】 ;
语句块必须缩进4个空格;
若在定义函数中,没有return语句,会隐式返回一个none值
定义中的参数列表成为形式参数,只是一种符号表达,简称为形参
调用:
函数定义,只声明一个函数,不会被执行,需要调用
在定义的函数后加上()即可调用
调用时()括号里的值时实际参数,是实实在在传入的值,简称为实参
定义函数举例:
def add(x,y):
result(x+y)
return result
定义完后调用add函数:
add(4,5)
因为有return,所有会返回4+5的值
上述函数定义中,有一个函数叫做add,可接收两个参数;
计算的结果,通过return返回;
调用通过函数add加2个参数,返回值可使用变量接收;
定义需要在调用前,也就是说调用是,已经被定义了,则会抛nameerror
查询一个函数是否存在,可用callable()
函数参数:
参数调用是传入的参数要和定义的个数匹配(*可变参数例外)
位置参数:
def f(x,y,z)调用使用 f(1,3,5)
按照参数定义顺序传送实参
关键字参数:
def f(x,y,z)调用可使用关键字f(x=1,y=2,z=3)
使用形参的名字来传送实参,如果使用看形参名字,则传参顺序就可以随意)
传参:
要求位置参数必须在关键字参数之前传入,位置参数是按位置对应的
函数参数的默认值:
定义参数时,位置参数在前,关键字在后
定义时,可在形参后跟上一个值:
def add(x=4,y=5):
return(x+y)
作用:
参数的默认值可在未传入足够的实参时,对没有给定的参数赋值为默认值
参数较多时,不需要用户每次都输入所有的参数,简化函数调用
可变参数:
一个形参可匹配任意个参数,包括0个
在形参前使用 *号,表示该参数时可变参数,可以接收多个实参
收集多个实参为一个tuple
关键字参数的可变参数:
举例:
def showconfig(**kwargs):
for k,v in kwargs.items():
print(‘{}={}‘.format(k,v))
形参前使用**符号,表示可接收多个关键字参数
收集的实参名称和值组成一个字典(利用items调用)
参数总结:
有位置可变参数和关键字可变参数;
使用位置可变参数,在形参前添加一个*即可表示
关键字可变参数在形参前添加两个**即可表示
位置可变参数和关键字可变参数都可以添加 0到若干 个实参,位置可变参数会收集成为一个元组,而关键字可变参数会收集为一个字典
混合使用参数时,普通位置参数在前,关键字参数其次,可变位置参数跟上,可变关键字参数收尾
用代码表示为 def fn( x , y=2 , *args , **kwargs )
keyword-only参数:
如果在一个*号参数后,或者一个位置可变参数后,出现的普通参数,实际上已经时keyword-only参数
举例:
def fn(*args,x):
print(x)
print(args)
fn(3,5,x=7)
args可以已经截获了所有的位置参数,x不使用关键字参数就拿不到实参
keyword-only不能在可变关键字后使用
def fn(**kwargs,x):
print(x)
print(kwargs)
因为※号后是keyword-only参数,所以只能用关键字传参,而关键字传参,会被可变关键字获取,所以x没有获取到参数会报错
keyword-only的另一种形式:
def fn(*,x,y):
print(x,y)
※号 只允许两个keyword-only参数,本身毫无意义
函数参数规则:
参数列表一般顺序为:普通参数,默认值参数,可变位置参数,keyword-only参数(可带缺省值),可变关键字参数
代码实现为(x , x=5,*args,y,y=5,**kwargs)
写函数时,应写的 易读易懂,按照书写习惯定义函数
参数解构和可变参数:
给元素提供实参时,可在集合类型前使用 * or ** ,把集合类型解开,提取所有元素作为函数的实参
举例:
def add(*iterable)
result=0
for x in iterable:
result+=x
return result
非字典类型使用 * 解构为 位置参数
字典类型使用 ** 解构为关键字参数
提取出来的元素数目要和参数的要求匹配,也要和参数的类型匹配
利用函数写一个程序,判断随机数的极值
import random
def nums(*args):
print(*args)
return max(args),min(args)
print(*nums([*randrom.randint(10,1000)for _ in range(10)]))
直接插入排序:
在未排序的序列中,构建一个以排序序列,直到排序完成
将待排序的数,插入进以排序的序列中合适的位置
增加一个哨兵,放入待比较值,让他和后面以排好的序列比较,找到合适的插入点
总结:
最好情况,正好时升序排序,比较迭代n-1次
最差情况,正好是降序排列,比较迭代1,2.....n-1即 n(n-1)/2
使用两层嵌套,时间复杂度为O(n^2)
使用小规模数据比较
优化:
如果比较操作耗时较大,可以采用二分查找来提高效率,即二分查找排序
以上是关于函数的封装解构的主要内容,如果未能解决你的问题,请参考以下文章