• python 函数(function)、函数(def)、函数(return)


    函数  function

    什么是函数:
      函数是可以重复执行的语句块,可以重复使用
      函数是面向过程编程的最小单位

    函数的作用:
      1.用于封装语句块,提高代码的重用性
      2.定义用户级别的函数

    def 语句  (把编码打包) call(调用)

    语法:
      def函数名(形参列表):
      语句块(代码块)
    说明:
      1.函数的名字就是语句块的名称
      2.函数名的命名规则与变是一名相同(函数名必须为标识符)
      3.函数名是一个变量(不要轻易对其赋值)
      4.函数有自己的名字空间,在函数外部不可以访问函数内部的变量(注意)在函数内部可以访问函数外部的变量,要让函数处理外部的数据需要传入一些数据
      5.函数如果不需要传入参数,则参数列表可以为空
      6.语句部分不能为空,如果为空需要填充pass语句
    作用:
      用于创建函数,用函数名这个变量绑定这个函数

    # 示例见:
    # 此示例示意用def语句定义一个没有参数的函数
    def say_hello():
        print("hello world!")
        print("hello china!")
        print("hello tarena!")

    函数的调用表达式:
      函数名(实际调用传递参数)

    说明:
      函数调用是一个表达式
      如果没有return语句,函数执行完毕后返回None对象

    # 示例见:
    # 此示例示意用def语句来定义带有参数的函数
    # 此函数名为mymax,有两个形式参数a,b 用于接收实参的传递
    # 此函数计算两个参数的最大值并打印
    def mymax(a,b):
        print("a=",a)
        print
        ("b=",b)
        if a>b:
            print(a,"大于",b)
        else:
            print(a,"小于",b)
    mymax(100,200)    #函数调用

    练习:

    # 3 写一个函数myadd,此函数中的参数列表里有两个参数x,y此函数的功能是打印 x+y的和
    # 如:
    #    def myadd(...):
    #        ...# ... 部分自己实现
    #    myadd(100,200)   #打印300
    #    myadd("ABC","123")  #打印 ABC123
    
    def myadd(x,y):
        z = x +y
        print("和是",z)
    myadd(100,200)   # 打印 300
    myadd("ABC","123")   # 打印ABC123
    
    

    # 写一个函数print_event,传入一个参数n代表终止的整数,打印0~n 之间所有的偶数 # 如: #  def print_event(n): #    ....此处自己完成 #  print_even(10) #  打印: #  0 2 4 6 8
    # 方法1 def print_event(n): for x in range(n):   if x % 2==0:     print(x) print_event(10)

    # 方法2
    def print_event(n): for x in range(0,n+1,2):   print(x) print_event(10)

    return 语句:

    语法:
      return[表达式]
      注:[]代表其中的内容可省略
    作用:
      用于函数中,结果当前函数的执行,返回到调用该函数的地方,同时返回
    一个对象的引用关系
    说明:
      1.return 语句先执行右侧的表达式,再将表达式的执行结果送回给当前函数的调用者
      2.return 语句右侧的表达式可以省略,省略后相当于 return None
      3.如果函数内没有return语句,则函数执行完最后一条语句后返回None)
      (相当于在最后加了一条return None语句)

    # 示例见:
    # 此示例示意return语句在函数中的应用
    def say_hello2():
        print("hello aaa")
        print("hello bbb")
        #return 1+ 2  #等同于 return None
        return [1,2,3,4,5]
        print("hello ccc")
    v = say_hello2()
    print("v=",v)
    
    v2 = say_hello2()
    print("v2=",v2)

    练习:

    # 1.写一个函数mymax,实现返回两个数的最大值:
    #    如:
    #        def mymax(a,b):
    #             ...
    #    print(mymax(100,200))#200
    #    print(mymax(100,200))#ABCD
    
    # 方法1
    def mymax(a,b):
        s = max(a,b)
        return s
    print(mymax(100,200))
    print(mymax("ABC","ABCD"))
    
    
    # 方法2
    def mymax(a,b):
        zuida = a
        if b > zuida:
            zuida = b
            return zuida
    print(mymax(100,200))
    print(mymax("ABC","ABCD"))
    
    
    # 2.写一个函数myadd,实现给出两个数,返回这个两个数的和
    # 如:
    #    def myadd(x,y):
            ....
    #    a = int(input("请输入第一个数:")
    #    b = int(input("请输入第二个数:")
    #    print("你输入的两个数的和是:",myadd(a,b))
    
    
    def myadd(x,y):
        return x+y
    a = int(input("请输入第一个数:"))
    b = int(input("请输入第二个数:"))
    print("你输入的两个数的和是:",myadd(a,b))
    
    
    # 3.写一个函数,input_number
    #    def input_number():
    #    ...# 此处自己实现,此函数返回列表
    #    此函数用来获取用户循环输入往返整数,当用户输入负数时结束输入
    #    将用户输入的数字以列表的形式返回,再用内建函数max,min,sum
    #    求出用户输入的最大值,最小值以及和
    
    #   L = input_number()
    #   print("用户输入的最大数是:",max(L))
    #   print("用户输入的最小数是:",min(L))
    #   print("用户输入的全部数的和是:",sum(L))
    
    def input_number():
        # 1.创建空列表
        l = []
        # 2.循环读取用户输入的正整数,存入在述列表
        while True:
            n = int(input("请输入用户数字:"))
            if n<0:
                break# 此处自己实现,此函数返回列表
            l.append(n)
        # 3.返回上述列表的引用关系
        return l
    L = input_number()
    print("用户输入的最大数是:",max(L))
    print("用户输入的最小数是:",min(L))
    print("用户输入的全部数的和是:",sum(L))

     python函数的参数传递(把数据给函数)

    传递方式:
      位置传参
      序列传参
      关键字传参
      字典关键字传参

    位置传参:
      实际参数(实参)的对应关系与形式参数(形参)的对应关系是按位置来依次对应的
    示意:

    def mymin(a,b,c)
        pass
    mymin(1,2,3)

    说明:
      实际参数和形式参数通过位置进行传递和匹配
      实际参数的个数必须与形式参数的个数相同

    # 示例:
    # 此示例示意位置传参
    def myfunl(a,b,c):
        "这是一个函数的传参的示例"
        print("a的值是:",a)
        print("b的值是:",b)
        print("c的值是:",c)
    
    myfunl(1,2,3)  # 1 --- a  2 ----b  3----c
    myfunl(4,5,6)

    序列传参
      序列传参是指在函数调用过程中,用*将序列拆解后按位置进行传递的
    传参方式

    # 示例见:
    # 此示例示意序列传参
    def myfunl(a,b,c):
        "这是一个函数的传参的示例"
        print("a的值是:",a)
        print("b的值是:",b)
        print("c的值是:",c)
    
    l1=[11,22,33]
    t2=(100,200,300)
    s3="ABC"
    myfunl(l1[0],l1[1],l1[2])  # li[0](将11)---> a, L1[1]
    myfunl(*l1) # 等同于myfunl(l1[0],l1[1],l1[2]) 
    myfunl(*t2)
    myfunl(s3[0],s3[1],s3[2])
    myfunl(*s3)
    
    # 说明:
      # 序列传参时,序列拆解的位置将与形参一一对应

    关键字传参:
      关键字传参是指传参时,按着形参的名称给形参赋值
      实参和形参按名称进行匹配

    # 示例见;
    # 此示例示意关键字传参
    def myfunl(a,b,c):
        "这是一个函数的传参的示例"
        print("a的值是:",a)
        print("b的值是:",b)
        print("c的值是:",c)
    myfunl(c=3,a=1,b=2)
    myfunl(c=33,a=11,b=22+3)
    
    # 说明:
    #    实参和形参接形参名进行匹配,可以不接位置进行匹配

    字典关键字传参:
      是指实参为字典,将字典用**拆解后进行关键字传参的传参方式

    # 示例见;
    def myfunl(a,b,c):
        "这是一个函数的传参的示例"
        print("a的值是:",a)
        print("b的值是:",b)
        print("c的值是:",c)
    d1 = {"c":33,"a":11,"b":22}
    myfunl(c=d1["c"],a=d1["a"],b=d1["b"])   #33---->c,11---->a
    myfunl(**d1)  #拆解字典,在按关键字传参方式传递
    
    # 说明:
    #    字典的键名和形参名必须一致
    #    字典的键名必须为符合标识符命名规则的字符串
    #    字典的键名要在形参中存在

    练习:

    # 已知有列表:
        L = [1,2,True,None,3.14]
        # 调用print函数,打印用“#”号分隔的文字信息到终端上
        print(...)  #打印  1#2#True#None#3.14
         
    l = [1,2,True,None,3.14]
    print(*l,sep="#")# 打印 1#2#True#None#3.14

    函数的综合传参:
      1.函数的传参方式,在能确定形参能唯一匹配到相应实参的情况
    下可以任意组合
      2.函数的位置传参要先于关键字传参

    # 示例:
    def myfun1(a,b,c)
        pass
    myfun1(100,c=300,b=200) #正确
    myfun1(c=300,b=200,100) #错的
    myfun1(100,*[200,300]) #正确
    myfun1(*[100,200],300) #正确
    myfun1(100,*[200],300) #正确
    myfun1(100,**{"c":300,"b":200}) #正确
    myfun1(**{"c":300,"b":200},a=100) #正确
    
    # 可变 和 不可变的类型的容器作为实参传递的区别:
        # 可变类型的实参作为参数传递时,在函数内部可以改变容器内的数据

    # 示例见: # 此示例示意,当函数的实参为可变数据类型时,在函数内部可以改为容器的内容 l = [1,2,3,4] t = (1.1,2.2,3.3,4.4) def append_5(x):   # x.append(5)   x += (5,)#新的x元组 append_5(l) print(l) append_5(t) #不存在 print(t)

    练习

    # 写一个函数,此函数读取用户输入的数据,最后保存于全局变量的列表
    # l中,当用户输入小于零的数时结束输入
    l=[]
    def input_number(l1):
        while True:
            x = int(input("请输入:"))
            if x<0:
                break
            l1.append(x)
    input_number(l)
    print(l)
    input_number(l)
    print(l)

     以下讲函数的定义(创建函数的def语句的形参列表)

    # 函数的缺省参数:
        # 语法:
    # def 函数名(形参名1 = 默认实参1,形参2=默认实参2,...):
        # 语句块
    
    # 示例见:
    def info(name,age=1,address="不详"):
        print(name,"今年",age,"岁.家庭住址",address)
    info("路飞",35,"北京市朝阳区")
    info("tarena",15)
    info("小飞")

    说明:
      缺省参数必须自右至左依次存在,如果一个参数有缺省参数,则其
      右侧的所有参数都必须有缺省参数,如:
        def test_fn(a,b=10,c): 是错的
      缺省参数可以有0个,1个或多个,甚至全部都有缺省参数

    # 示例:
    def fn(a,b=10,c):# 错误
        pass
    def fn(a=0,b=10,c=20) # 这是对的
        pass

    练习:

    # 写一个函数myadd,此函数可以计算两个数,三个数及四个数的和
    def myadd(...):
    ....
        print(myadd(10,20))#30
        print(myadd(100,200,300))#600
        print(myadd(1,2,3,4))#10
    
    def myadd(a,b,c=0,d=0):
        return a + b+ c +d 
    print(myadd(10,20))
    print(myadd(100,200,300))
    print(myadd(1,2,3,4,))

    函数形参的定义方式:

      1.位置形参
      2.型号的元组形参
      3.命名关键字形参
      4.双星号字典形参

    # 位置形参
        # 语法:
    # def 函数名(形参名1,形参名2...):
        # 语句块
    # 星号无组形参:
        # 语法:
    # def 函数名(*元组形参名):
        # 语句块
    # 作用:
        # 收集多余的位置传参
    # 说明:
        # 在一个函数定义中元组形参名最多只能有一个,一般命名为"args"
    
    
    # 示例见:
    # 此示例示意星号元组形参的定义和使用
    def func(*args):
        print("实参个数是",len(args))
        print("args=",args)
    func(1,2,3,4)
    func(5,6,7,8,"A","B","C","D")
    func()

     练习:

    # 写一个函数 mysun 可以传入任意个数字实参,返回所有实参的和
    # def mysum(*args):
        # ...
    # print(mysum(1,2,3,4))
    # print(mysum(,1,3,5,7,9))
    
    # 方法1
    def mysum(*args):
        s = 0
        for x in args:
            s +=x
        return s
    print(mysum(1,2,3,4))
    print(mysum(1,3,5,7,9))
    
    # 方法2
    def mysum(*args):
        return sum(args)
    print(mysum(1,2,3,4))
    print(mysum(1,3,5,7,9))

    命名关键字形参

    # 语法:
       # def 函数名(*,命名关键字形参1,命名关键字形参2,...):
           # 语句块
       #
       # def 函数名(*args,命名关键字形参1,命名关键字形参2,..)
           # 语句块
    # 作用:
       # 强制所有的参数都必须用关键字传参或字典关键了传参
    # 示例见:
       # named_keyword_args.py
    
    # 此示例示意在函数形参中定义命名关键字形参,强制让函数调用使用命名# 关键字传参:
    def funcl(a,b,*,c,d):
        print(a,b,c,d)
    funcl(1,2,3,4)  # 报错
    funcl(1,2,c=30,d=40)
    funcl(a=10,b=20,c=30,d=40)
    
    def funcl(a,b,*args,c,d):
        print(a,b,args,c,d)
    funcl(1,2,3,4)  # 报错
    funcl(1,2,c=30,d=40)
    funcl(a=10,b=20,c=30,d=40)
    funcl(1,2,3,4,d=400,c=300)
    funcl(*"ABCDEFG",**{"c":999,"d":888})

    双星号字典形参

    # 语法:
        # def 函数名(**字典形参名)
            # 语句块
    # 作用:
            # 收集多余的关键字传参
    # 说明:
        # 字典形参名一般命名"kwargs"
        # 一个函数内字典形参最多只能有一个
    
    # 示例见:
    # 此示例示意用双星号字典形参接收多余的关键字传参
    def func(**kwargs):
        print("关键字传参的个数是:",len(kwargs))
        print("kwargs=",kwargs)
    func(name="weimingze",age=35,address="北京时朝阳区")
    func(a=1,b=2)
    
    def func(a,b,**kwargs):
        print("关键字传参的个数是:",len(kwargs))
        print("kwargs=",kwargs)
    func(a=1,b=2,c=3)
    
    
    # 函数的参数说明:
        # 位置形参,缺省参数,星号元组形参,双星号字典形参可以混合使用

    函数参数自左自右的顺序为:

    # 1.位置形参
    # 2.星号元组形参
    # 3.命名关键字形参
    # 4.双星号字典形参
    
    # 示例:
    def fn(a,b=20,*args,c=30,d=40,**kwargs):
        pass
    fn(1)
    fn(100,200,300,400,c="C",d="D",e="E")

    练习:

    # 已知内建函数max帮助文档为:
    # max(...)
    # max(iterable)  -> value
    # max(arg1,arg2,*args) -> value
    # 仿造 max写一个mymax函数,功能与max完全相同
       #(要求不允许调用max')
    # 测试程序如下:
    # print(mymax([6,8,3,5]))  #8
    # print(mymax(100,200))    #200
    # print(mymax(1,3,5,7,9)) #9
    
    # 方法1
    def mymax(*args):
      if len(args)==1: #判断是否是一个可迭代参数的情况
        l = args[0] #一定绑定一个可迭代对象
        zuida = l[0]
        for x in l:
          if x >zuida:
            zuida = x
          return zuida 
      else: #否则有多个参数的情况
        zuida = args[0]
        for x in args:
          if x>zuida:
            zuida = x
          return zuida 
    print(mymax([1,3,5,7,9]))
    print(mymax(100,200))
    print(mymax(6,8,3,5))
    
    # 方法2
    def mymax(a,*args):
      if len(args)==0: #判断是否是一个可迭代参数的情况
        l = a #一定绑定一个可迭代对象
        zuida = l[0]
        for x in l:
          if x >zuida:
            zuida = x
        return zuida 
      else: #否则有多个参数的情况
        zuida = a
        for x in args:
          if x>zuida:
            zuida = x
        return zuida

    全局变量和局部变量

      局部变量:local varible:
      定义在函数内部的变量称为局部的变量(函数的形参也是局部变量)
      局部变量只能在函数内部使用
      局部变量在函数调用时才能够被创建,在函数调用之后会自动销毁
      当有同名的全局变量和局部变量时,优先访问局部变量

      全局变量:global variable:
      定义在函数外部,模块内部的变量称为全局变量
      全局变量,所有函数都可以直接访问(但函数内不能将其直接赋值)


    局部变量说明:
      在函数内部赋值语句不会对全局变量造成影响
      局部变量只能在其被声明的函数内部访问,而全局变量可以在整数模块范围内访问

    # 示例见:
    # global_local.py
    # 此示例示意全局变量的定义和局部变量的定义
    a = 100
    b = 200
    c = 999999
    def fx(c):
        a = 1 # 创建局部变量,并没有改变全局变量
        d = 400
        print(a,b,c,d)
    fx(300)
    print("a=",a)
    print("b=",b)
    print("c=",c) 
    
    # globals 和 locals 函数: # globals() 返回当前全局作用域内变量的字典 # locals() 返回当前局部作用域内变量的字典

    # 示例见: # globals_and_locals.py # 此示例示意全局变量的定义和局部变量的定义 a = 100 b = 200 c = 999999 def fx(c):   a = 1 # 创建局部变量,并没有改变全局变量   d = 400   print(a,b,c,d) fx(300) print("a=",a) print("b=",b) print("c=",c) # 此示例示意globals 和 locals 函数的使用方法 a = 1 b = 2 c = 3 def fn(c,d):   e = 300   # 此处有多少个局部变量?   print("locals()返回:",locals())   # 此处有多少个全局变量?   print("locals()返回:",globals())   print(c)   print(globals()["c"]) fn (100,200)
  • 相关阅读:
    敏捷开发第五天
    敏捷开发第四天
    系统用户分析模型
    第三天敏捷开发
    第二天敏捷开发
    敏捷开发第一天
    第三周学习总结
    [学习笔记]莫队算法
    【网络流】Modular Production Line
    [学习笔记]set的使用
  • 原文地址:https://www.cnblogs.com/Axianba/p/11240152.html
Copyright © 2020-2023  润新知