zoukankan      html  css  js  c++  java
  • Python学习 :函数

    函数

    函数(Functions)

    是指可重复使用的程序片段。它们允许你为某个代码块赋予名字,允许你通过这一特殊的名字在你的程序任何地方来运行代码块,并可重复任何次数。这就是调用(Calling)函数。

    函数的作用:

    1、减少重复代码

    2、方便修改,更易扩展

    3、保持代码的一致性 

    函数的创建:

    def 函数名(参数1,参数2...):

          函数体(语句块)

    函数名的命名规则:

    必须以下划线和小写字母为开头,一般用小写字母和单下划线、数字等组合函数名是区分大小写的

    函数体(语句块)前,需要缩进4个空格

    调用函数时一定记得要加括号

    函数名后面的括号中,可以有参数列表,也可以没有参数

    函数名是区分大小写的

    形参与实参:

    形参:形势参数,在函数中定义时的参数,不实际存在,是虚拟的变量

    实参:实际参数,在调用函数过程中使用的参数,传给形参

    区别:形参是虚拟的,不占用内存空间,只有在被调用时才分配内存单元

       实参是一个变量,占用内存空间,数据传送单向,实参传给形参,不能形参传给实参

     

    函数的参数

    一、必需的参数:

    必需参数须以正确的顺序传入函数中,调用时的顺序必须和函数声明时一致

    二、关键字参数

    函数可以通过关键字参数来确定传入的参数值,使用关键字参数允许函数调用时参数时顺序与声明时不一致,关键字参数在实参中添加

    def print_info(name,age,job):
        print('Name: %s' %name)
        print('Age: %d' %age)
        print('Job: %s' %job)
    
    print_info('Mike',20,'student')  #必需参数
    print_info(name='Mike',age=20,job='student') #关键字参数
    

     三、默认参数(缺省参数)

    调用函数时,默认参数的值如果没有被传入,即为默认值,默认参数可以在形参中添加

    def print_info(name,age,job='student'):  #默认参数需要跟在其他参数后
        print('Name: %s' %name)
        print('Age: %d' %age)
        print('Job: %s' %job)
        print('---------------------')
    print_info('Mike',20)
    print_info('Alex',20)
    print_info('John',35,'teacher')   #改变默认参数的值

    四、不定长参数

    当处理比当初声明时更多的参数时,可以使用不定长参数,声明时不需要进行命名。

    星号(*)的变量名会存放所有未命名的变量参数,使用一个元组来进行储存。

    两个星号(**)的变量名会存放命名的变量参数,使用字典中的键值对来进行储存

    注意:关于不定长参数的位置:*args参数放在左边,**args参数放在右边

       如果有默认参数存在,放在左边,关键字参数放在最左边,最后是不定长参数

    Eg.*args

    def add(*args):  #*args表示函数接收不定长的参数
        print(args)
        sum = 0
        for i in args: # args为一个元组
            sum += i
        print(sum)
    add(1,2,3)

     Eg.**kwargs

    def print_info(*args,**kwargs):
        print(args)
        print(kwargs)
        for i in kwargs:
            print('%s : %s' %(i,kwargs[i]))
    print_info('John',35,'teacher',hobby='reading') #**kwargs数据会被处理成为一对键值对放入字典中

    函数的返回值

    获取函数的执行结果,可以使用return语句来执行把结果返回

    return的作用:1、结束当前函数 2、返回某个对象的值

    注意:1.函数默认的return值为None,即如果未指定return语句,函数默认返回None

       2.return可以返回多个对象,并把多个对象封装成为一个元组,作为一个整体输出

    函数的作用域

    4种不同的作用域:

    L:local,局部作用域,也称本地作用域,函数中定义的变量;

    E:enclosing,嵌套作用域,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;

    G:global,全局作用域,全局变量,就是模块级别定义的变量;

    B:built-in,内建作用域,系统固定模块里面的变量,例如int,bytearray;

    a = 0 # global
    d = 4 # global
    def outer():
        c = 3 # enclosing
        d = 5 # enclosing
        global a
        a = 1  # 由 enslosing 修改为 global
        def inner():
            b = 2  # local
            d = 6  # local
            print('本地作用域中变量b:',b)
            print('此时的变量d:',d)
        inner() # 调用inner函数
        print('嵌套作用域中变量c:',c)
        #print(b) 语句会报错(name 'b' is not defined),因为python找不到变量b声明的值
    
    outer()
    print('全局作用域中变量a:',a)
    >>>本地作用域中变量b: 2
      此时的变量d: 6
      嵌套作用域中变量c: 3
      全局作用域中变量a: 1

    global关键字

    在内部作用域中,当要修改外部作用域(全局作用域)的变量的时候,这时可以使用global关键字

    a = 0 # global
    def outer():
        global a
        a = 1 # 将 enclosing 修改为 global
    print('-------------------')
    print('修改前:', 'a =', a)
    outer() # 调用outer函数
    print('-------------------')
    print('修改后:', 'a =', a)
    >>>-------------------
       修改前: a = 0
       -------------------
       修改后: a = 1

    nonlocal关键字

    在嵌套作用域中,当要修改嵌套作用域(enclosing作用域,外层非全局作用域)中的变量时,这时可以使用nonlocal关键字

    def outer():
        a = 1  # enclosing
        b = 7  # enclosing
        def inner():
            a = 2 # local
            nonlocal b
            b = 8 # 将 local 修改为 enclosing
        print('-------------------')
        print('修改前:','a =',a,'b =',b)  #没有调用inner函数前,a,b的值
        inner()
        print('-------------------')
        print('修改后:','a =',a,'b =',b)  #调用了inner函数,a的值依然没有修改,因为a=2是在local中
    outer()
    >>>-------------------
       修改前: a = 1 b = 7
       -------------------
       修改后: a = 1 b = 8

    注意:

    • 搜索变量的优先级顺序:作用域局部>>外层作用域>>当前模块中的全局>>python内置作用域;
    • 只有模块、类以及函数才能引入新的作用域;
    • 对于一个变量,内部作用域先声明就会覆盖外部变量,倘若不声明直接使用,就会使用外部作用域的变量;
    • 内部作用域要修改外部作用域变量的值时,修改全局变量要使用global关键字,修改嵌套作用域变量要使用nonglobal关键字;
  • 相关阅读:
    小议sql查询返回xml数据之应用【转载】 sansan
    JScript中Date.getTime转.Net中的DateTime sansan
    iFrame 跨域高度自适应问题解决 sansan
    使用第三方应用(天气预报、Google地图之类)不影响原来页面的加载 sansan
    【转载】今天心情非常好,再发一组 Linq、 集合、数组、Lambda、QuerySyntax 的文章 sansan
    高性能ASP.NET站点构建之简单的优化措施 sansan
    Linq to SQL sansan
    高并发量网站解决方案
    JAVA开源项目[转]
    淘宝下单高并发解决方案
  • 原文地址:https://www.cnblogs.com/ArticleYeung/p/9782763.html
Copyright © 2011-2022 走看看