zoukankan      html  css  js  c++  java
  • Python学习-函数,函数参数,作用域

    一、函数介绍

    函数定义:函数时组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

    我们已经知道python提供了许多内建函数,print(), type()等。我们也可以自己创建函数,这被叫做用户自定的函数。

    定义一个函数

    定义是遵守的简单的规则:

    • def关键字开头,后接函数标识符名称和圆括号(),然后以冒号:结尾(第一行也叫函数头)

    • 圆括号中放入参数名(形参),如果没有,可以留空

    • 函数头的下一行,缩进4个空格,开始写函数体

    • 函数体中可以有return [表达式]语句,返回一个值给调用者,如果没有return语句,默认返回None

    一个自定义函数实例:

    # 打印两次传入的变量的值
    # 此函数没有return语句,返回None给调用者
    def print_twice(name):  #函数头 形参:name
        print('你好', name)  #函数体
        print('你好', name)

    定义一个函数会创建一个函数对象(function object),其类型是funtion:

    print(print_twice)
    print(type(print_twice))
    
    #输出结果:
    <function print_twice at 0x10217df28>
    <class 'function'>

    函数调用:

    调用方式,函数名(),如果函数有参数,将实际参数(实参)放入括号中。

    print_twice('jason')
    #输出结果
    你好 jason
    你好 jason
    
    #使用一个变量接收函数返回值
    r = print_twice('jason')
    print(r)
    #输出结果
    你好 jason
    你好 jason
    None

    执行流程

    #py文件中代码如下,我们来分析下具体的执行流程
    def print_twice(name):
        print('你好', name)
        print('你好', name)
    
    r = print_twice('jason')
    print(r)
    print('这是其他代码块')

    请记住, 程序的执行流程总是从第一条语句开始, 自顶向下, 每次执行一条语句.

    以上代码执行流程如下:

    第一句, 定义一个函数, 但是函数体是不会执行的, 只有当函数被调用时, 才执行函数中的函数体.

    然后, 到r = print_twice('jason')语句, 调用自定义函数print_twice, 这时会执行函数体, 即内部的打印语句.

    然后, 到print(r)语句, 打印变量r, 由于函数没有return语句, 所以r的值为None,打印None.

    最后, 执行最后一条print语句, 此py程序文件执行完毕.

    注意: 函数不被调用的话, 函数内部的语句是不会被执行的.

    二、函数中的参数类型

    Python函数中的参数类型:

    • 位置参数

    • 不定长参数

    • 默认参数

    • 关键字参数

    位置参数

    位置参数必须以正确的顺序传入参数. 调用函数时给定参数的数量必须和声明时的一样.

    def print_greeting(greeting, name):
        print('%s, %s' %(greeting, name))
    
    print_greeting('hello', 'jason')
    # 运行结果
    hello, jason
    
    # 如果调用时给的参数不足
    print_greeting('hello')
    # 报错
    TypeError: print_greeting() missing 1 required positional argument: 'name'

    关键字参数

    定义的函数参数较少时, 我们通过位置传参还可以接受; 如果定义的函数参数很多, 我们不仅要记住有哪些参数, 而且还要记住每个参数的位置, 否则, 函数就不能正常调用. Python提出了一种叫做关键字参数, 不需要记住每个参数的位置, 只需要记住参数的名字就可以了.

    def print_greeting(greeting, name):
        print('%s, %s' %(greeting, name))
    
    print_greeting(greeting='hello', name='jack')
    # 运行结果
    hello, jack

    默认参数

    调用函数时,如果没有传递参数,则会使用参数的默认值。

    def print_greeting(greeting, name='world'):
        print('%s, %s' %(greeting, name))
    
    print_greeting(greeting='hello')
    # 运行结果
    hello, world
    
    print_greeting(greeting='hi', name='snow')
    # 运行结果
    hi, snow

    不定长参数

    你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数, 声明时不会命名

    def printinfo( arg1, *vartuple ):
       "打印任何传入的参数"
       print ("输出: ")
       print (arg1)
       print (vartuple)
     
    # 调用printinfo 函数
    printinfo( 70, 60, 50 )
    
    # 运行结果
    70
    (60, 50)
    
    # 加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。

    还有一种就是参数带两个星号. 加了两个星号 ** 的参数会以字典的形式导入。

    def printinfo( arg1, **vardict ):
       "打印任何传入的参数"
       print ("输出: ")
       print (arg1)
       print (vardict)
     
    # 调用printinfo 函数
    printinfo(1, a=2,b=3)
    
    # 运行结果 
    1
    {'a': 2, 'b': 3}

    以上四种参数类型, 定义函数时, 可以混合出现.

    注意:

    在使用混合参数时, 关键字参数必须在位置参数后面; 定义函数时, 必须先声明位置参数, 才能声明默认值参数.

    三、变量作用域

    局部作用域: 函数内部定义的或者在代码块中的变量

    全局作用域: 直接在py文件中, 函数外定义的变量 + 内置命名空间

    可以使用globals()查看全局命名空间; 使用locals()查看局部命名空间

    局部变量使用:

    # No.1
    num = 100
    def func():
        num = 50
        print('local_num:', num)
    func()
    print('global_num:', num)
    #输出:
    local_num: 50
    global_num: 100
    
    # No.2
    num = 100
    def func():
        print('num:', num)  # 使用的是全局变量
    func()
    print('global_num:', num)
    #输出
    num: 100
    global_num: 100
    
    # No.3
    num = 100
    def func():
        num = num + 10  # 在局部未定义num
        print('num:', num)
    func()
    print('global_num:', num)
    # 输出  运行会报错
    UnboundLocalError: local variable 'num' referenced before assignment(大概意思是在局部未定义就直接引用)
        
    # No.4
    num = 100
    def func():
        global num  # 在局部如果想改变全局变量, 需使用global关键字先引入变量
        num = num + 10
        print('num:', num)
    func()
    print('global_num:', num)
    # 输出
    num: 110
    global_num: 110
        
    # No.5  nonlocal关键字
    num = 100
    def func():
        num = 50  # 此处如果没有定义num, 即使有全局变量num, 内层函数func2也无法使用nonlocal num语句
        print('num:', num)
        def func2():
            nonlocal num  # 向上层(上级)寻找num变量, 知道找到为止; 但是不会找到全局变量处
            num = num + 10
            print('num:', num)
        func2()
    func()
    # 输出
    num: 50
    num: 60

    总结:

    1. 优先读取函数内变量, 如果没有找到, 再去找全局变量

    2. 局部变量与全局变量同名, 局部变量重新声明赋值, 对全局变量没有影响

    3. 如果在函数内想改变全局变量, 需先使用global关键字引入该变量

    相关名词定义:

    a. 全局变量:在模块内、在所有函数外面、在class外面,这就是全局变量

    b. 局部变量:在函数内、在class的方法内(未加self修饰的),这就是局部变量

    c. 静态变量:在class内的,但不在class的方法内的,这就是静态变量

    d. 实例变量:在class的方法内的,用self修饰的变量,这就是实例变量

  • 相关阅读:
    JQ常用代码
    websocket练习
    动软生成器 model生成模板
    动软生成器 Liger model生成模板
    SVN各种错误提示产生原因及处理方法大全
    winfom实现关闭后一直运行
    在yii中使用分页
    html文字垂直居中
    给浏览器网页标签页添加图标
    html 遇到margin居中的问题
  • 原文地址:https://www.cnblogs.com/gandoufu/p/9325547.html
Copyright © 2011-2022 走看看