zoukankan      html  css  js  c++  java
  • 函数详解

    定义函数的规则如下:

    • 函数代码块以 def 关键词开头。

    • 后接函数名称和圆括号 () 。

    • 圆括号中可以使用参数。

    • 函数内容以冒号起始,并且缩进。

    • return 结束函数,可以选择性地返回一个值。不带 return 相当于返回 None。

    函数样式:

    def 函数名(形式参数):
    函数体
    return 返回值

    例一:

    默认函数的参数是按照位置顺序传递的。

    注意:函数要运行分两步:

    1、定义函数

    2、调用函数(如果有参数,要传入参数)

     1 # 定义函数。其中a,b为形式参数
     2 def f(a, b):
     3     c = a*2 - b
     4     return c
     5 
     6 
     7 # 调用函数,其中3,5为实际参数
     8 # 调用函数的时候,3对应形式参数的a,5对应形式参数的b
     9 result = f(3, 5)
    10 print(result)

    运行结果:

    1 "D:Program Files (x86)pythonpython.exe" E:/python/python爬虫/从0开始、/a7.py
    2 1
    3 
    4 Process finished with exit code 0
    • 实际参数:简称实参,我们刚才在调用函数的时候传入 3 和 6 就是实参。主要体现在实际执行函数的时候使用。

    • 形式参数:简称形参,我们刚才在定义函数的时候 add(a, b) 中的 a 和 b 就是形参。主要体现在它只是一个形式和格式,真正要执行的时候还是要看传入的实参。

    整个函数调用就是将实参传递给形参,完成计算后返回,并且打印返回值。

    例二:

    函数的参数可以按照赋值传递

     1 # 定义函数。其中a,b为形式参数
     2 def f(a, b):
     3     c = a*2 - b
     4     return c
     5 
     6 
     7 # 调用函数,其中3,5为实际参数
     8 # 按照赋值传递参数
     9 result = f(b=3, a=5)
    10 print(result)

    运行结果:

    1 "D:Program Files (x86)pythonpython.exe" E:/python/python爬虫/从0开始、/a7.py
    2 7
    3 
    4 Process finished with exit code 0
    result = f(b=3, a=5)中,b=3, a=5为关键字参数

    可变参数

    例一:以元组的形式输出

    1 # 在参数 b 前面加一个 * ,表示这个参数是可变长度参数,当前面的参数都赋值结束后,剩下的参数顺次给这个参数赋值。
    2 def print_num(a, b, *c):
    3     print(a, b, c)
    4 
    5 
    6 # 调用函数,其中1赋值给a,2的值赋值给b,3,4,5全部复制给了c,其中3,4,5以元组的形式输出打印
    7 print_num(1, 2, 3, 4, 5)

    运行结果:

    1 "D:Program Files (x86)pythonpython.exe" E:/python/python爬虫/从0开始、/a8.py
    2 1 2 (3, 4, 5)
    3 
    4 Process finished with exit code 0

    例二:

     1 # *a表示a是一个可变长度的参数,传入的参数依次给a赋值,并将a的值以元组的形式打印出来
     2 def print_num(*a):
     3     print(a)
     4 
     5 
     6 # 传入多个参数,依次给a赋值
     7 print_num(1, 2, 3, 4, 5)
     8 # 使用列表的形式,当做一个参数传递
     9 print_num([2, 3, 4, 5])
    10 # 使用元组的形式,当做一个参数传递
    11 print_num((2, 3, 4, 5, 6))
    12 # 当传入列表形式,并且列表前面有*的情况下,当做多个值依次传递给a
    13 print_num(*[2, 3, 4, 5, 6])

    运行结果:(注意:输出的结果均为元组类型)

    1 "D:Program Files (x86)pythonpython.exe" E:/python/python爬虫/从0开始、/a9.py
    2 (1, 2, 3, 4, 5)
    3 ([2, 3, 4, 5],)
    4 ((2, 3, 4, 5, 6),)
    5 (2, 3, 4, 5, 6)
    6 
    7 Process finished with exit code 0

    我们传进的所有参数都会被a变量收集,它会根据传进参数的位置合并为一个元组(tuple),a是元组类型,这就是包裹位置传递

    例二:以字典的形式输出

    我们还可以给这个参数前面加两个 * ,表示这个参数可以传递的数据类型是以字典的形式传递的

    a是一个字典(dict),收集所有关键字参数

    1 # **a表示a是一个可变长度的参数,表示这个参数可以传递的数据类型是以字典的形式传递的
    2 def print_num(f, **a):
    3     print(f, a)
    4 
    5 
    6 # 调用函数,根据位置,55赋值给了f,后面的赋值给了**a,并且以字典的形式输出
    7 print_num(55, a=1, b=2, c=3, d=4)
    8 # 字典前加**,字典中每对键值对做为一个关键字参数传递给函数
    9 print_num(66, **{'a': 1, 'b': 2, 'c': 3, 'd': 4})

    运行结果:

    1 "D:Program Files (x86)pythonpython.exe" E:/python/python爬虫/从0开始、/a10.py
    2 55 {'a': 1, 'b': 2, 'c': 3, 'd': 4}
    3 66 {'a': 1, 'b': 2, 'c': 3, 'd': 4}
    4 
    5 Process finished with exit code 0

    例三:两种可变参数的区别

     1 def different(*a, **k):
     2     print('a = ', a)
     3     print('k = ', k)
     4     print('```'*10)
     5 
     6 
     7 different(1, 2, 3, 4)
     8 different(b=2, c=3, d=4)
     9 different(1, 2, 3, 4, b=2, c=3, d=4)
    10 different('a', 1, None, b=2, c='3', d=4)

    运行结果:

     1 "D:Program Files (x86)pythonpython.exe" E:/python/python爬虫/从0开始、/a11.py
     2 a =  (1, 2, 3, 4)
     3 k =  {}
     4 ``````````````````````````````
     5 a =  ()
     6 k =  {'b': 2, 'c': 3, 'd': 4}
     7 ``````````````````````````````
     8 a =  (1, 2, 3, 4)
     9 k =  {'b': 2, 'c': 3, 'd': 4}
    10 ``````````````````````````````
    11 a =  ('a', 1, None)
    12 k =  {'b': 2, 'c': '3', 'd': 4}
    13 ``````````````````````````````
    14 
    15 Process finished with exit code 0

    可以看到,这两个是Python中的可变参数。*args 表示任何多个无名参数,它是一个tuple;**kwargs 表示关键字参数,它是一个dict。

    并且同时使用*args和**kwargs时,必须*args参数列要在**kwargs前,像different(a=1, b='2', c=3, a', 1)这样调用的话,会提示语法错误SyntaxError: positional argument follows keyword argument

    出现这个bug的原因在于参数位置不正确,关键字参数必须跟随在位置参数后面! 因为python函数在解析参数时, 是按照顺序来的, 位置参数是必须先满足, 才能考虑其他可变参数。

    例四:注意各种参数的位置

    1 def abc(a, b=3, *c, **d):
    2     print(a)
    3     print(b)
    4     print(c)
    5     print(d)
    6 
    7 
    8 abc(4, 5, 6, 7, x=55, y=66)

    运行结果:

    1 "D:Program Files (x86)pythonpython.exe" E:/python/python爬虫/从0开始、/a12.py
    2 4
    3 5
    4 (6, 7)
    5 {'x': 55, 'y': 66}
    6 
    7 Process finished with exit code 0

    注意:各种参数的位置不能错,默认参数b必须放在*c之前,*c必须放在**d之前,调用函数的时候,实际参数修正形式参数的值,所以b的输出结果为5

    1、位置参数:

    调用函数时所传参数的位置必须与定义函数时参数的位置相同,且有多种类型的参数定义和调用函数时,位置参数应该放在最前面

    2、关键字参数(函数调用的时候指定):

    使用关键字参数会指定参数值赋给哪个形参,调用时所传参数的位置可以任意

    3、可变参数:

    *位置参数:可接受任意数量的位置参数(元组);只能作为最后一个位置参数出现,其后参数均为关键字参数

    **关键字参数:可接受任意数量的关键字参数(字典);只能作为最后一个参数出现

    4、默认参数(函数定义的时候指定,本例中b=3为默认参数):

    默认参数的赋值只会在函数定义的时候绑定一次。

    默认的形式参数可以不传递实际参数。

    如果想改变形式参数的默认值,那么正常的传递一个实际参数就行了,本例中给默认参数b=3又传递了实际参数5改变了默认参数b的值。

    变量的作用域

    全局变量和局部变量
    例一:

     1 # 全局变量
     2 c = 1
     3 
     4 
     5 def add(x, y):
     6     # 局部变量,作用域仅仅在函数内部
     7     c = x*2 + y
     8     print(c)
     9 
    10 
    11 # 调用函数,输出的是函数里面局部变量的值
    12 add(2, 3)
    13 # 在函数外部打印输出c就是全局变量,全局变量的值不会因为局部变量而更改
    14 print(c)

    运行结果:

    1 "D:Program Files (x86)pythonpython.exe" E:/python/python爬虫/从0开始、/a13.py
    2 7
    3 1
    4 
    5 Process finished with exit code 0

    在函数里面定义了一个和全局变量同名的变量,局部变量不会覆盖全局变量。

    ————————————————

  • 相关阅读:
    System.setProperty()
    ExtJs自学教程(1):一切从API開始
    【福利!】英雄联盟国服更新补丁速度极慢的解决方法
    ORACLE触发器具体解释
    我的Hook学习笔记
    Runood-JSP:JSP 客户端请求
    Runoob-JSP:JSP 隐式对象
    Runoob-JSP:JSP 动做元素
    Runoob-JSP:JSP 指令
    Runoob-JSP:JSP 生命周期
  • 原文地址:https://www.cnblogs.com/youngxinwei/p/13303261.html
Copyright © 2011-2022 走看看