• python基础---函数


    一、函数

      通过函数,可以对特定的代码功能进行封装,实现代码的复用。

    1、函数的声明(定义)

      def 函数名(参数列表):

        代码

      不带参数的函数定义:

        def printInfo():

          print('Hello world!!')

      带参数的函数定义:

        def print(a,b):

          return a+b

    2、函数的调用

      调用方式: 函数名(实参列表)

       printInfo()

       sumV = add(10,20)  ## 这里传入的是实参

    3、函数的返回值

      通过return返回函数的返回值

      函数中,默认return返回None,不写return也是返回None  ,return None也可以简写为return

      在函数中,无论在return后面是否有语句,遇到return整个函数就直接结束

      continue:结束本次循环,进入下一次循环

      break:

    特别的地方:

      在python中可以一次返回多个值

     1 def move(x, y):
     2     return x+10,y+10
     3 
     4 ##定义两个变量接受返回值:
     5 x,y=move(12,20)
     6 print('x=%d,y=%d'%(x,y))
     7 
     8 ##定义一个变量接收返回值,返回值为元组类型:
     9 point=move(20,30)
    10 print(point)
    11 print(point[0])

    4、参数传递

      python的所有变量的内容都是内存地址,也就是说变量指向内存的对象的一个指针

      都是值的引用,其类型分都是对象决定的

     (1) id函数:获取变量的地址

       a = 10

       print(id(a))  ##输出:1231232314

     (2)值类型:

       值类型对象本身不允许修改,数值的修改实际上让变量指向一个新的对象

       (也是就是数值本身的内容变成了另外一个新的内存地址)

      不可变对象包含:字符串、元祖、数值---- 这些都不允许修改 ,做参数传递的时候,在内部改变量的值,不能影响外部变量的值

    1 a = 10
    2 b = 20
    3 def swap(x, y): ##传递的是值类型,函数内部修改参数的值,外部的变量没有作用
    4 temp = x
    5 x = y
    6 y = temp
    7 swap(a, b)
    8 print(a, b) ##输出 :10 20

     (3)引用类型

      可变对象:列表、字典等,本身允许修改

      如果函数传递的是引用类型,在函数内操作直接影响到外部的变量

     5、局部变量全局变量

      1函数内部使用的变量称为局部变量

      2函数外定义的变量称为全局变量

        全局变量能够在所有的函数中进行访问

        如果在函数中修改全局变量,那么就需要使用global进行声明,否则出错

        如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量(所谓强龙不压地头蛇)

     1 def test3():
     2     global b #使用global后,就可以对全局变量进行修改
     3     b = 100
     4     
     5 test3()
     6 print(b)
     7 
     8 li = [1,]
     9 def f2():
    10     li.append(1)#如果全局变量是可变类型,函数内可以直接修改其内容
    11     print(li)
    12 f2()

     二、函数的参数

      1、位置参数

        传入的时候,按照定义的时候的位置依次传入。

    1 def pow(x)
    2     return x*x
    3 
    4 p = pow(10)
    5 print(p)
    6 #传参时,还可以指定参数名称,必须与函数定义中的一样
    7 print(pow(x = 100))

      2、默认参数

        在定义函数的时候,可以设定默认参数。但是默认参数,要放在后面,否追报语法错误

    1 def  pow(x,n=3):
    2         xxx
    3 
    4 pow(10)  ## 这样x=10,n默认就等于3

      3、可变参数-

        传入的参数组成元祖!!

        允许你传入任意个参数,这些参数再掉用的时候,组装成了一个元祖(tuple)!!!

     1 def sum2(*args):## *args 任意长度,把接收到的全部数据最为元祖
     2     print(type(args))  ##args是元祖!!!
     3     sumV = 0
     4     for v in args: ## 可变参数
     5         sumV+=v
     6     print(sumV)
     7 
     8 sum2(1,2,3,4,5,6,7,8,9,0)
     9 
    10 l = [2,3,4]
    11 sum2(l[0],l[1],l[2]) ##这样不方便
    12 sum2(*l) ###把列表中的元素,给sum2    
    13          ### *[2,3,4] 将列表中的元素取出来,作为可变参数传给函数
    14          ### 同样元祖也可以
    15 l2 = (1,2,3)
    16 sum2(*l2)
    17 sum2(*[1,2,3,4,5])

      4、关键字参数

        允许你传入任意个参数,这些参数再调用的时候,组装成了一个字典(dict)!!!

     1 def person(**kw): ##内部处理成字典
     2     print(kw)        ##kw是一个字典
     3     # print(type(kw))
     4     # print(kw['name'])## 输出zhangsan
     5 
     6 person(name='zhangsan',age= '10')
     7 
     8 d = {'name':'zhangsan','age':11}
     9 person(**d) ## 把字典取出来,一个个传递进去
    10             ## **d 相当于name='zhangsan',age= '11'
    11 
    12 ## 可以接收任意参数!!
    13 ## 不方便写逻辑,不知道怎么处理
    14 def test(*args,**kw): ##声明 args处理成元祖--包装
    15     print(args)
    16     print(kw)
    17     #test1(*(10,20))
    18 test1(*args,**kw)##调用-- 解开!!
    19 
    20 def test1(a,b):
    21     print(a+b)
    22 
    23 # test(10,20)   ##输出:(10,20)
    24 # test(10,a=20) ##输出:(10,)
    25                 ##     {'a': 20}
    26 
    27 test(10,20)

    三、递归

      函数内部自己调用自己,但是一定要有结束条件!!

    1 求4的阶乘,4!=4*3! ,  3! = 3*2!, ...
    2 def jiecheng(n):
    3     if n==1:  ## 结束条件
    4         return 1
    5     return n * jiecheng(n - 1) ##n一定要改变
    6 
    7 s = jiecheng(3)
    8 print(s)

    四、匿名函数

      没有名字的函数叫匿名函数,也叫lambda函数

      语法: lambda 参数:表达式

        左边的参数可以有多个,但是右边的表达式只能有一个

        使用lambda函数时,需要一个变量接收结果

      lambda函数可以作为实参,传递给函数

     1 '''简单用法'''
     2 ## 匿名函数无法调用
     3 ## 通过赋值的方式,相当于给了名字
     4 add1 = lambda a, b :a+b
     5 print(add(10,20))
     6 
     7 ''' 匿名函数作为函数的参数传递'''
     8 
     9 def mul(a,b):
    10     return a*b
    11 
    12 def calcute(a,b,func): ## 第三个参数表示传入函数变量
    13     return func(a,b)
    14 
    15 ## 通过函数名传递函数!!!--普通!!
    16 print(calcute(12,3,mul))
    17 print(calcute(12,3,add))
    18 
    19 ## 传入lambda表达式 相当于func = lambda x,y:x+y 
    20 print(calcute(10,50,lambda x,y:x+y))

      小例子:

    1 = [(2,12),(6,23),(4,24)]
    l.sort(key = lambda x :x[1],reverse=True)
    print(l)
    '''
        sort(key=None,reverse=None) ##自带默认参数默认从小到达排序
        key: 表示排序的条件,指定按照哪个排
        
        so, 匿名函数就是,把元祖的第二个取出来排
        ##  l.sort()  已经把列表元素取出来了,只需要再取元祖的第二个元素即可
    '''

    五、闭包

      一句话,内部函数调用外部函数的变量(一般是要装饰的函数名),返回内部函数的函数名!!(相关参数和变量都保存在返回的函数中)

      函数闭包的要素
      1、外部函数和内部函数
      2、内部函数使用外部函数的变量
      3、内部函数返回函数名()
      其他逻辑视情况而定!!

     1 ## 闭包实例!!
     2 def sum_out(*args):
     3     ## 定义内部函数
     4     def sum_in():
     5         ##使用外部函数的变量
     6         sumV = sum(args) ##元祖求和
     7         return sumV  # 返回结果
     8     return sum_in    ##返回函数
     9 
    10 print(sum_out(1,2,3,4)())
    11 
    12 ss =sum_out(1,2,3,4) 
    13 print(ss())  ## z真正调用的是sum_in()

    六、装饰器

      就是在闭包的基础上,参数改为函数,该函数就是我们传递进来并且要装饰的对象。

     1 # 装饰器其实就是一个以函数作为参数并返回
     2 # 一个替换函数的可执行函数
     3 
     4 import time
     5 def add():
     6     # print('调用时间:%s' %time.strftime('%Y-%m-%d %H:%M:%s'))
     7     print('add')
     8 add()
     9 
    10 print('-----------')
    11 ## 装饰器的实现
    12 def log(func):
    13     def wrapper():
    14         # print('调用时间:%s' %time.strftime('%Y-%m-%d %H:%M:%s'))
    15         # print('调用%s时间:%s' %(func.__name__,time.strftime('%Y-%m-%d %H:%M:%s')))
    16         print('调用:%s' %func.__name__)
    17         func()
    18     return wrapper
    19 
    20 add_warp = log(add)
    21 add_warp()
    22 
    23 print('--------------')
    24 def mul():
    25     print('mul')
    26 
    27 mul_warp = log(mul)
    28 mul_warp()
    29 
    30 
    31 add = log(add)
    32 add() ##这个已经不是原来的add    
    33       ##已经被装饰了一回
    34 
    35 
    36 ## 借助add语法,作用到指定函数
    37 @log  ##装饰这个函数 相当于sub = log(sub)
    38 def sub():
    39     print('sub')
    40 
    41 sub() ## 实际上不是原来的sub,已经被装饰过一回!!
     1 ##带参数的装饰器
     4 import functools
     6 
     7 def log(func):
     8     ## 接受任意的参数
     9     ## 作用:wrapper变成了add wrapper.__name__=func.__name__
    10     ### @functools.wraps(func) ##工具--- 加了这个原执行的表面wrapper 变成了add真实函数
    11     def wrapper(*args,**kw): ##可变参数--任意参数
    12         print('调用!!')    
    13         # print('args=',args)
    14         # print('kw=',kw)       ##若是没有就会返回None
    15         return func(*args,**kw) ##通用写法 得到返回值 
    16     return wrapper        
    17 
    18 @log   ##相当于 add = log(add)
    19 def add(a,b):
    20     return a+b 
    21 
    22 # add = log(add)  log(add)() =wrapper()
    23 
    25 print(add(10,30))
    26 print(id(add))
    27 add()
    28 
    29 print('----------------------------')
    31 
    32 aaa = log(add) 
    33 print(aaa.__name__)  ##真正执行的函数是wrapper!!!!
    34 
    35 def add(a,b)
    36     return 
    37 
    38 def aa(func):
    39     def ssb():
    41         return a+b
    43     return ssb
    44 
    45 add()

    *七、偏函数--- 基本没啥用

      把一个函数的某些参数给固定住(就是设置默认值),得到一个新的函数

    八、高阶函数

      定义:一个函数接收另外一个函数作为参数,称之为高阶函数

      1、map() 函数

        将传入的函数作用到列表的每一个元素

        map(函数,可迭代对象)   一般搭配lambda或者自己定义函数

     1 def f(x):
     2     return x*x
     3 ## 1、2、3、4、.... 相当于f(1)、f(2)。。。。
     4 m = map(f,range(1,9)) ## map对象 ---可以被遍历
     5 for v in m:
     6     print(v) ##输出结果
     7 
     8 ##map和匿名函数
     9 m = map(lambda x:x+3,range(1,5))
    10 for j in m:
    11     print(j)

      2、reduce()函数

        对传入序列(作用于每一个元素)做累积运算

        格式:reduce(函数,可迭代对象),搭配lambda使用

     1 from functools import reduce ##引入函数
     2 def add(x,y):
     3     return x+y
     4 '''
     5 简单写法
     6 '''
     7 r = reduce(add,[1,2,3])
     8 print(r)   # 输出:6
     9 
    10 '''
    11 reduce 搭配lambda ,更简单的写法
    12 '''
    13 
    14 r2 = reduce(lambda x,y:x+y,[1,2,3])
    15 print(r2)    ##输出:6

      3、filter()函数---过滤

        用于过滤序列,他把传入的函数作用于每一个元素,如果是True就保留该元素,Flase去掉该元素

     1 ##得到列表中的偶数
     2 
     3 '''
     4 普通写法
     5 '''
     6 z= [3,2,12,4,23,57,13]
     7 
     8 def t(x):
     9     return x%2==0
    10 
    11 b = filter(t,z)
    12 print(b)
    13 
    14 ''''
    15 高级写法
    16 ''''
    17 a = filter(lambda x:x%2==0,z)
    18 print(a)

      

      

    有生之年,只诉衷肠不言殇.....
  • 相关阅读:
    django学习第85天Django的Ajax
    django学习第84天Django常用字段和参数
    django学习第83天Django聚合查询.分组查询.FQ查询
    django学习第82天Django多表查询
    django学习第81天Django模板层2(单表查询.模块的导入和继承.静态文件配置)
    django学习第80天Django模板层1
    django学习第79天Django视图层
    Linux 内核文档翻译
    Linux设备模型——设备驱动模型和sysfs文件系统解读
    内核空间内存申请函数kmalloc kzalloc vmalloc的区别
  • 原文地址:https://www.cnblogs.com/dyl01/p/8520438.html
Copyright © 2020-2023  润新知