首页 > 技术文章 > 函数的封装解构

spidermansam 2017-10-16 09:08 原文

函数的定义:
     数学定义函数: 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)
     使用小规模数据比较
     优化:
          如果比较操作耗时较大,可以采用二分查找来提高效率,即二分查找排序

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

推荐阅读