zoukankan      html  css  js  c++  java
  • python的函数

    一、函数的定义

            函数是组织好的,可重复使用的,用来实现一定功能的代码段。
    函数能提高应用的模块性,和代码的重复利用率。
     

    二、函数定义及其语法

    函数代码块以def关键词开头,后接函数名称和圆括号()
    传入的任何参数和自变量放在圆括号()中间
    函数的内容以冒号起始,并且缩进
    函数的第一行语句可以选择性的使用文档字符串————用于存放函数说明
    return 【表达式】结束函数,选择性的返回一个值给调用方。不带表达式的return相当于返回None
    函数使用原则:先定义,再调用
    语法:
    def  函数名(参数1,参数2,参数3,...):
                   函数体
                    return  返回的值
    函数名()
    注意:函数名要能反映其意义

     示例:

    def func():                        #函数的定义
        print("Hello wprld")
    func()                             #函数的调用(调用就是函数名加上括号)

    三、函数的返回值

    return语句【表达式】退出函数(结束一个函数的执行),选择性地向调用方返回一个表达式。

    返回值可以是任意数据类型。

    如果函数有返回值,必须使用变量接收才有效果。

    返回值情况:

    1,返回值为None的情况

    • 当不写return时,默认返回值为None

    • return不加参数时,返回None

    • return None

    2,返回值不为None的情况

    返回一个值: return xxx 返回一个值(一个变量) 任意数据类型

    返回多个值: return a,b,[1,2,3] ; 用一个变量接收时返回的是一个元祖,也可以用相应数量的变量去接收, 可以返回任意多个、任意数据类型的值

    示例:

    不写return时,默认返回值为None
    
    def func():   #函数定义
        s ="hello world"
        print(s)
    str = func()  #函数调用
    print('str: %s'%str)   #因为没有返回值,此时的str_len为None
    
    运行结果:
    hello world
    str: None
    return不加参数时,返回None
    
    def func():
        s ="hello world"
        print(s)
        return
    str = func()
    print('str: %s'%str)
    
    运行结果:
    hello world
    str: None
    return None
    
    def func():
        s ="hello world"
        print(s)
        return None
    str = func()
    print('str: %s'%str)
    
    运行结果:
    hello world
    str: None
    
    返回一个值
    
    
    def func():
        s ="hello world"
        print(s)
        return s
    str = func()       
    print('str: %s'%str)
    
    运行结果:
    hello world
    str: hello world
    
    返回多个值
    
    
    
    def func():
        s ="hello world"
        s1 = 'hi'
        print(s)
        return 1,2
    str = func()
    print(str)
    
    运行结果:
    hello world
    (1, 2)
    
    
    
    
    
    def func():
        s ="hello world"
        s1 = 'hi'
        print(s)
        return 1,2
    str1,str2 = func()
    print(str1,str2)
    
    运行结果:
    hello world
    1 2
    View Code

     四、函数的参数

    1.位置参数

    函数调用时根据函数定义的参数位(形参)置来传递参数
    示例:
    #-*- coding:utf-8 -*-2
    def msg(name,age):
     print("Hello,your name is %s,your age is %s"%(name,age))
    msg('root',12)
    View Code
    位置参数必须一一对应,缺一不可

    2.关键字参数

    在函数调用时,通过‘键--值’方式为函数形参传值,不用按照位置为函数形参传值。
    注意:
    1. 关键字参数必须在位置参数右边
    2. 对同一个形参不能重复传值
    # #-*- coding:utf-8 -*-
    #
    # 按照顺序为函数形参传值
    # def msg(name,age,sex):
    #     print("Hello,your name is %s,age is %s,sex is %s"%(name,age,sex))
    # msg('root',12,'男')
    
    #有位置参数和关键字参数时,关键字参数要放在位置参数后面
    # def msg(name,age,sex):
    #     print("Hello,your name is %s,age is %s,sex is %s"%(name,age,sex))
    # msg('root',12,sex= '男')
    
    # 参数中有多个关键字参数时,关键字参数不分先后顺序
    # def msg(name,age,sex):
    #     print("Hello,your name is %s,age is %s,sex is %s"%(name,age,sex))
    # msg('root',sex= '男',age= 22)
    正确示例
    # 关键字参数放在了位置参数的前面
    # def msg(name,age,sex):
    #     print("Hello,your name is %s,age is %s,sex is %s"%(name,age,sex))
    # msg(name='root',22,'男')
    
    # def msg(name,age,sex):
    #     print("Hello,your name is %s,age is %s,sex is %s"%(name,age,sex))
    # msg('root',age=12,'男')
    错误示例

    3.默认参数

    在定义函数时,可以为形参提供默认值。对于有默认值的形参,调用函数时如果为该参数传值,则使用传入的值,否则使用默认值。
    注意:
    1. 在调用函数时可以不给有默认值的形参传值
    2. 无论是函数的定义还是调用,默认参数的定义应该在位置形参右面
    3. 只在定义时赋值一次
    4. 默认参数通常应该定义成不可变类型
    示例:
    def msg(name,age,sex=''): #默认参数在关键字参数后面  ...
    def test(x,y=2):
        print(x)
        print(y)
    test(2)        #只给一个参数传值,则另外一个使用默认值
    View Code

    4.非固定参数

    当函数定义时不确定要传入多少个实参时,就可以使用非固定参数。而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*args,**kwargs
    4.1*args  接收的是实参,位置参数,将转化成元祖返回
    def test(*args):
        print(args)
    test(1,2,3,4,5)
    
    运行结果:
    (1, 2, 3, 4, 5)
    View Code
    def test1(x,*args):
        print(x)
        print(args)
    test1(1,2,3,4,5)
    
    运行结果:
    (2, 3, 4, 5)
    View Code
    4.2*kwargs 接收的是实参,关键字参数,将转化成字典返回
    def func(a,b,**kwargs):
        print(a,b,kwargs)
    func(a = 10,b = 20,cc = 30,dd = 40)
    运行结果:
    10 20 {'cc': 30, 'dd': 40}
    View Code
     参数定义顺序:位置参数->*args->默认参数->**kwargs

    五、全局变量与局部变量

    • 在函数中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
    • 全局变量作用域是整个程序,局部变量作用域是定义该变量的函数。
    • 当全局变量与局部变量同名时,在定义局部变量的函数内,局部变量起作用;在其它地方全局变量起作用。
    • global关键字:在函数内部修改全局变量

    六、变量的作用域

    一个程序的所有变量并不是在哪个位置都可以访问的。访问权限决定于这个变量实在哪里赋值的。
    命名空间:
    局部命名空间
    全局命名空间
    内置命名空间
    定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
    局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:
    #!/usr/bin/python
    #-*- coding:UTF-8 -*-
    total = 0 # 这是一个全局变量
    def sum(arg1,arg2):
        '''返回2个参数的和'''
        total1 = arg1 + arg2   #total在这里局部变量
        print('函数内是局部变量:',total)
        return(total)
    #调用sum函数
    sum(10,20);
    print('函数外是全局变量:’,total)
    #输入结果
    函数内是局部变量:30
    函数外是全局变量:0
    View Code
    变量查找顺序:先查找全局作用域,然后内置作用域
    global关键字:可以是在函数内部声明的变量变成全局变量
    nonlocal关键字:可以让内部函数中的变量在上一层函数中生效,外部必须要有这个变量
     
    # -*- coding: UTF-8 -*-
    globvar = 0
    def set_globvar_to_one():
        global globvar    # 使用 global 声明全局变量
        globvar = 1
    def print_globvar():
        print(globvar)     # 没有使用 global
    set_globvar_to_one()
    print  globvar        # 输出 1
    print_globvar()       # 输出 1,函数内的 globvar 已经是全局变量
    View Code

    七、匿名函数

    python使用lambda来创建匿名函数。
    1.lambda只是一个表达式,函数体比def简单很多。
    2.lambda的主题式一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
    3.lambda函数拥有自己的命名空间,且不能访问只有参数列表之外或全局命名空间里的参数
    4.虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率
    语法:lambda函数的语法只能包含一个语句,如下:
    lambda[arg1[,arg2,......argn]]:expression
    如下实例:
    #!/usr/bin/python
    #-*- coding:UTF-8 -*-
    sum = lambda arg1,arg2:arg1 + arg2;
    print('相加后的值为:‘,sum(10,20)
    print('相加后的值为:‘,sum(20,20)
    以上实例输出结果:
    相加后的值为:30
    相加后的值为:40
    View Code

    八、闭包

    定义:

      python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包

    def func1():
        x = 12
        def func2():
            print(x)
        return func2
    f = func1()
    print(type(f))
    print(f)
    f()
    
    执行结果:
    <class 'function'>
    <function func1.<locals>.func2 at 0x000002016685B9D8>
    12
    View Code
    结合这段简单的代码和定义来说明闭包:
    如果在一个内部函数里:f2()就是这个内部函数,
    对在外部作用域(但不是在全局作用域)的变量进行引用:x就是被引用的变量,x在外部作用域f1()里面,但不在全局作用域里。
    则这个内部函数f2()就是一个闭包。
      从函数的定义角度出发:函数可以嵌套使用,可以把函数当成参数或返回值进行传递,函数也可以作为容器类型的元素,作为一个变量可以去赋值。
      在这个简单的例子当中,函数f1()中嵌套定义另一个函数f2(),内部的函数f2()引用了外部函数f1()的变量,函数f2()被当成夹带外部变量的 对象 返回给f1(),这样就形成一个闭包函数。
      实例化输出的时候 定义的 f=f1()中, 其实 f 就是函数f2()(不准确但是好理解)。这里需要注意的是,f 是一个函数名,加上()就能当作函数来用了。(因为f2()返回的是一串函数执行过程的包)
    闭包的用途
    闭包就是为了不动原函数里面的代码,还要给它增加‘新功能’的一种手段。

    九、装饰器

    装饰器是闭包的一种应用场景,符合开放封闭原则
    *对扩展是开放的
    *对修改是封闭的
    功能:就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能
    作用:解耦,尽量的让代码分离,小功能之前的分离。
       解耦目的,提高代码的重用性
    代码示例:
    #_*_coding:utf-8_*_
    
    
    def login(func):
        def inner():
            _username = 'alex'
            _password ='123'
            username = input("user:")
            password = input("password:")
            if username == _username and password ==_password:
                print("Login Sucess")
            else:
                print("Error")
        return inner
    
    @login # home = login(home)
    def home():
        print("---Home Page----")
    
    
    def pic():
        print("-----Picture-----")
    
    
    #home = login(home)
    home()
    无参装饰器
    user_status = False
    def login(auth_type):
        def outer(func):
            def inner(*args,**kwargs ):
                _name= 'alex'
                _passwd = '123'
                global user_status
                if user_status == False:
                    name = input('姓名:')
                    password = input('密码:')
                    if name == _name and password == _passwd:
                        print("welcome")
                        user_status = True
                    else:
                        print('error')
                if user_status == True:
                    func(*args,**kwargs)
            return inner
        return outer
    @login('qq')
    def home(abc):
        print("====首页=====")
    # @login
    def vidio():
        print("电影")
    def book():
        print("书籍")
    home1 = login('qq')
    home = home1(home)
    home('qa')
    有参装饰器
     
  • 相关阅读:
    利用pyautogui自动化领取dnf的在线养竹活动的竹子
    idea2019.3版本的安装
    二叉树文本分析
    表达式树的创建
    24点游戏
    二叉树
    队列操作
    HuffmanTree
    两数之和
    面向对象Python
  • 原文地址:https://www.cnblogs.com/kumunotes/p/10589664.html
Copyright © 2011-2022 走看看