zoukankan      html  css  js  c++  java
  • 函数的封装解构

    函数的定义:
         数学定义函数: 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)
         使用小规模数据比较
         优化:
              如果比较操作耗时较大,可以采用二分查找来提高效率,即二分查找排序
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    【HDOJ】2267 How Many People Can Survive
    【HDOJ】2268 How To Use The Car
    【HDOJ】2266 How Many Equations Can You Find
    【POJ】2278 DNA Sequence
    【ZOJ】3430 Detect the Virus
    【HDOJ】2896 病毒侵袭
    求奇数的乘积
    平方和与立方和
    求数列的和
    水仙花数
  • 原文地址:https://www.cnblogs.com/spidermansam/p/7675462.html
Copyright © 2011-2022 走看看