菜鸟教程 -- 学的不仅是技术,更是梦想!

Python 3 教程
Python3 教程 Python3 简介 Python3 环境搭建 Python3 VScode Python3 基础语法 Python3 基本数据类型 Python3 数据类型转换 Python3 解释器 Python3 注释 Python3 运算符 Python3 数字(Number) Python3 字符串 Python3 列表 Python3 元组 Python3 字典 Python3 集合 Python3 条件控制 Python3 循环语句 Python3 编程第一步 Python3 推导式 Python3 迭代器与生成器 Python3 with Python3 函数 Python3 lambda Python3 装饰器 Python3 数据结构 Python3 模块 Python __name__ Python3 输入和输出 Python3 File Python3 OS Python3 错误和异常 Python3 面向对象 Python3 命名空间/作用域 Python 虚拟环境的创建 Python 类型注解 Python3 标准库概览 Python3 实例 Python 测验

Python3 高级教程

Python3 正则表达式 Python3 CGI编程 Python3 MySQL(mysql-connector) Python3 MySQL(PyMySQL) Python3 网络编程 Python3 SMTP发送邮件 Python3 多线程 Python3 XML 解析 Python3 JSON Python3 日期和时间 Python3 内置函数 Python3 MongoDB Python3 urllib Python uWSGI 安装配置 Python3 pip Python3 operator Python math Python requests Python random Python OpenAI Python 有用的资源 Python AI 绘画 Python statistics Python hashlib Python 量化 Python pyecharts Python selenium 库 Python 爬虫 Python Scrapy 库 Python Markdown Python sys 模块 Python Pickle 模块 Python subprocess 模块 Python queue 模块 Python StringIO 模块 Python logging 模块 Python datetime 模块 Python re 模块 Python csv 模块 Python threading 模块 Python asyncio 模块 Python PyQt Python for 循环 Python while 循环
(追記) (追記ここまで)

Python3 函数

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

函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。


定义一个函数

你可以定义一个由自己想要功能的函数,以下是简单的规则:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()
  • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号 : 起始,并且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。

语法

Python 定义函数使用 def 关键字,一般格式如下:

def 函数名(参数列表):
 函数体

默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的。

实例

让我们使用函数来输出"Hello World!":

#!/usr/bin/python3

def hello() :
print("Hello World!")

hello()

更复杂点的应用,函数中带上参数变量:

实例(Python 3.0+)

比较两个数,并返回较大的数:

#!/usr/bin/python3defmax(a, b): ifa > b: returnaelse: returnba = 4b = 5print(max(a, b))

以上实例输出结果:

5

实例(Python 3.0+)

计算面积函数:

#!/usr/bin/python3# 计算面积函数defarea(width, height): returnwidth * heightdefprint_welcome(name): print("Welcome", name)print_welcome("Runoob")w = 4h = 5print("width =", w, " height =", h, " area =", area(w, h))

以上实例输出结果:

Welcome Runoob
width = 4 height = 5 area = 20

函数调用

定义一个函数:给了函数一个名称,指定了函数里包含的参数,和代码块结构。

这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从 Python 命令提示符执行。

如下实例调用了 printme() 函数:

实例(Python 3.0+)

#!/usr/bin/python3# 定义函数defprintme(str): # 打印任何传入的字符串print(str)return# 调用函数printme("我要调用用户自定义函数!")printme("再次调用同一函数")

以上实例输出结果:

我要调用用户自定义函数!
再次调用同一函数

参数传递

在 python 中,类型属于对象,对象有不同类型的区分,变量是没有类型的:

a=[1,2,3]
a="Runoob"

以上代码中,[1,2,3] 是 List 类型,"Runoob" 是 String 类型,而变量 a 是没有类型,它仅仅是一个对象的引用(一个指针),可以是指向 List 类型对象,也可以是指向 String 类型对象。

可更改(mutable)与不可更改(immutable)对象

在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。

  • 不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变 a 的值,相当于新生成了 a。

  • 可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。

python 函数的参数传递:

  • 不可变类型:类似 C++ 的值传递,如整数、字符串、元组。如 fun(a),传递的只是 a 的值,没有影响 a 对象本身。如果在 fun(a) 内部修改 a 的值,则是新生成一个 a 的对象。

  • 可变类型:类似 C++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后 fun 外部的 la 也会受影响

python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。

python 传不可变对象实例

通过 id() 函数来查看内存地址变化:

实例(Python 3.0+)

defchange(a): print(id(a))# 指向的是同一个对象a=10print(id(a))# 一个新对象a=1print(id(a))change(a)

以上实例输出结果为:

4379369136
4379369136
4379369424

可以看见在调用函数前后,形参和实参指向的是同一个对象(对象 id 相同),在函数内部修改形参后,形参指向的是不同的 id。

传可变对象实例

可变对象在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了。例如:

实例(Python 3.0+)

#!/usr/bin/python3# 可写函数说明defchangeme(mylist): "修改传入的列表"mylist.append([1,2,3,4])print("函数内取值: ", mylist)return# 调用changeme函数mylist = [10,20,30]changeme(mylist)print("函数外取值: ", mylist)

传入函数的和在末尾添加新内容的对象用的是同一个引用。故输出结果如下:

函数内取值: [10, 20, 30, [1, 2, 3, 4]]
函数外取值: [10, 20, 30, [1, 2, 3, 4]]

参数

以下是调用函数时可使用的正式参数类型:

  • 必需参数
  • 关键字参数
  • 默认参数
  • 不定长参数

必需参数

必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。

调用 printme() 函数,你必须传入一个参数,不然会出现语法错误:

实例(Python 3.0+)

#!/usr/bin/python3#可写函数说明defprintme(str): "打印任何传入的字符串"print(str)return# 调用 printme 函数,不加参数会报错printme()

以上实例输出结果:

Traceback (most recent call last):
 File "test.py", line 10, in <module>
 printme()
TypeError: printme() missing 1 required positional argument: 'str'

关键字参数

关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。

使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

以下实例在函数 printme() 调用时使用参数名:

实例(Python 3.0+)

#!/usr/bin/python3#可写函数说明defprintme(str): "打印任何传入的字符串"print(str)return#调用printme函数printme(str = "菜鸟教程")

以上实例输出结果:

菜鸟教程

以下实例中演示了函数参数的使用不需要使用指定顺序:

实例(Python 3.0+)

#!/usr/bin/python3#可写函数说明defprintinfo(name, age): "打印任何传入的字符串"print("名字: ", name)print("年龄: ", age)return#调用printinfo函数printinfo(age=50, name="runoob")

以上实例输出结果:

名字: runoob
年龄: 50

默认参数

调用函数时,如果没有传递参数,则会使用默认参数。以下实例中如果没有传入 age 参数,则使用默认值:

实例(Python 3.0+)

#!/usr/bin/python3#可写函数说明defprintinfo(name, age = 35): "打印任何传入的字符串"print("名字: ", name)print("年龄: ", age)return#调用printinfo函数printinfo(age=50, name="runoob")print("------------------------")printinfo(name="runoob")

以上实例输出结果:

名字: runoob
年龄: 50
------------------------
名字: runoob
年龄: 35

不定长参数

你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述 2 种参数不同,声明时不会命名。基本语法如下:

def functionname([formal_args,] *var_args_tuple ):
 "函数_文档字符串"
 function_suite
 return [expression]

加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。

实例(Python 3.0+)

#!/usr/bin/python3# 可写函数说明defprintinfo(arg1, *vartuple): "打印任何传入的参数"print("输出: ")print(arg1)print(vartuple)# 调用printinfo 函数printinfo(70, 60, 50)

以上实例输出结果:

输出: 
70
(60, 50)

如果在函数调用时没有指定参数,它就是一个空元组。我们也可以不向函数传递未命名的变量。如下实例:

实例(Python 3.0+)

#!/usr/bin/python3# 可写函数说明defprintinfo(arg1, *vartuple): "打印任何传入的参数"print("输出: ")print(arg1)forvarinvartuple: print(var)return# 调用printinfo 函数printinfo(10)printinfo(70, 60, 50)

以上实例输出结果:

输出:
10
输出:
70
60
50

还有一种就是参数带两个星号 **基本语法如下:

def functionname([formal_args,] **var_args_dict ):
 "函数_文档字符串"
 function_suite
 return [expression]

加了两个星号 ** 的参数会以字典的形式导入。

实例(Python 3.0+)

#!/usr/bin/python3# 可写函数说明defprintinfo(arg1, **vardict): "打印任何传入的参数"print("输出: ")print(arg1)print(vardict)# 调用printinfo 函数printinfo(1, a=2,b=3)

以上实例输出结果:

输出: 
1
{'a': 2, 'b': 3}

声明函数时,参数中星号 * 可以单独出现,例如:

def f(a,b,*,c):
 return a+b+c

如果单独出现星号 *,则星号 * 后的参数必须用关键字传入:

>>> def f(a,b,*,c):
... return a+b+c
... 
>>> f(1,2,3) # 报错
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: f() takes 2 positional arguments but 3 were given
>>> f(1,2,c=3) # 正常
6
>>>

匿名函数

Python 使用 lambda 来创建匿名函数。

所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。

  • lambda 只是一个表达式,函数体比 def 简单很多。
  • lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
  • lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
  • 虽然 lambda 函数看起来只能写一行,却不等同于 C 或 C++ 的内联函数,内联函数的目的是调用小函数时不占用栈内存从而减少函数调用的开销,提高代码的执行速度。

语法

lambda 函数的语法只包含一个语句,如下:

lambda [arg1 [,arg2,.....argn]]:expression

设置参数 a 加上 10:

实例

x = lambdaa : a + 10print(x(5))

以上实例输出结果:

15

以下实例匿名函数设置两个参数:

实例(Python 3.0+)

#!/usr/bin/python3# 可写函数说明sum = lambdaarg1, arg2: arg1 + arg2# 调用sum函数print("相加后的值为 : ", sum(10, 20))print("相加后的值为 : ", sum(20, 20))

以上实例输出结果:

相加后的值为 : 30
相加后的值为 : 40

我们可以将匿名函数封装在一个函数内,这样可以使用同样的代码来创建多个匿名函数。

以下实例将匿名函数封装在 myfunc 函数中,通过传入不同的参数来创建不同的匿名函数:

实例

defmyfunc(n): returnlambdaa : a * nmydoubler = myfunc(2)mytripler = myfunc(3)print(mydoubler(11))print(mytripler(11))

以上实例输出结果:

22
33

更多匿名函数还可以参考:Python lambda(匿名函数)


return 语句

return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的 return 语句返回 None。之前的例子都没有示范如何返回数值,以下实例演示了 return 语句的用法:

实例(Python 3.0+)

#!/usr/bin/python3# 可写函数说明defsum(arg1, arg2): # 返回2个参数的和."total = arg1 + arg2print("函数内 : ", total)returntotal# 调用sum函数total = sum(10, 20)print("函数外 : ", total)

以上实例输出结果:

函数内 : 30
函数外 : 30

强制位置参数

Python3.8 新增了一个函数形参语法 / 用来指明函数形参必须使用指定位置参数,不能使用关键字参数的形式。

在以下的例子中,形参 a 和 b 必须使用指定位置参数,c 或 d 可以是位置形参或关键字形参,而 e 和 f 要求为关键字形参:
def f(a, b, /, c, d, *, e, f):
 print(a, b, c, d, e, f)

以下使用方法是正确的:

f(10, 20, 30, d=40, e=50, f=60)

以下使用方法会发生错误:

f(10, b=20, c=30, d=40, e=50, f=60) # b 不能使用关键字参数的形式
f(10, 20, 30, 40, 50, f=60) # e 必须使用关键字参数的形式

x = True
def printLine(text):
 print(text, ' Runoob')
printLine('Python')
def greetPerson(*name):
 print('Hello', name)
 
greetPerson('Runoob', 'Google')
result = lambda x: x * x
print(result(5))
def Foo(x):
 if (x==1):
 return 1
 else:
 return x+Foo(x-1)
print(Foo(4))
numbers = [1, 3, 6]
newNumbers = tuple(map(lambda x: x , numbers))
print(newNumbers)
AI 思考中...

20 篇笔记 写笔记

  1. #0

    不跟随

    368***[email protected]

    412

    默认参数必须放在最后面,否则会报:

    SyntaxError: non-default argument follows default argument
    
    # 可写函数说明
    def printinfo( age=35,name): # 默认参数不在最后,会报错
     "打印任何传入的字符串"
     print("名字: ", name)
     print("年龄: ", age)
     return

    不跟随

    368***[email protected]

    9年前 (2017年07月28日)
  2. #0
    124

    def(**kwargs) 把N个关键字参数转化为字典:

    >>> def func(country,province,**kwargs):
    ... print(country,province,kwargs)
    ... 
    >>> func("China","Sichuan",city = "Chengdu", section = "JingJiang")
    China Sichuan {'city': 'Chengdu', 'section': 'JingJiang'}
    >>> 
    
    9年前 (2017年07月28日)
  3. #0

    dessertfox

    che***[email protected]

    172

    lambda 匿名函数也是可以使用"关键字参数"进行参数传递

    >>> g= lambda x,y : x**2+y**2
    >>> g(2,3)
    13
    >>> g(y=3,x=2)
    13

    同样地,lambda 匿名函数也可以设定默认值

    >>> g= lambda x=0,y=0 : x**2+y**2
    >>> g(2,3)
    13
    >>> g(2)
    4
    >>> g(y=3)
    9

    注意:如果只打算给其中一部分参数设定默认值,那么应当将其放在靠后的位置(和定义函数时一样,避免歧义),否则会报错。

    dessertfox

    che***[email protected]

    9年前 (2017年08月14日)
  4. #0

    Mr.Wang

    992***[email protected]

    153

    关于可更改与不可更改类型, 以及其它语言的值类型与引用类型的介绍,一直一来感觉都不太严谨, 说法是否正确有待验证。

    简单的说就是,不可更改类型传到函数里重新赋值后,两次输出值不一样,而可更改类型传到函数里对对象的"属性" 重新赋值后输出值一样。

    这里照搬一下例子:

    # 可写函数说明
    def changeme( mylist ):
     "修改传入的列表"
     mylist.append([1,2,3,4])
     print ("函数内取值: ", mylist)
     return
     
    # 调用changeme函数
    mylist = [10,20,30]
    changeme( mylist )
    print ("函数外取值: ", mylist)

    请注意:上面特意用了引号标准的部分,对可变类型或者引用的操作修改的是传过来的对象的属性。

    可以这么理解(例子有点随意):我在画画,小明来了说他也要画,我让他和我一起画,他如果和我在同一个画板上画,那么我们两的画就会同时改变。 而如果他说不,我要另外用一块画板,然后重新拿了块画板画起来了,那么我们两的画自然就不一样了。

    同理可更改类型 的属性进行操作,这只是对引用的内存块里面的值进行操作,引用并没变,自然所有引用它的对象的值都变了。而对不可更改的对象进行操作,因为它引用的内存块只是对应一个固定的值,不能进行修改,要重新复制实际上就是更新引用。

    如果我们运行下面的例子,对可更改类型的引用进行修改,结果就不一样了。

    # 可写函数说明
    def changeme( mylist ):
     "修改传入的列表"
     mylist = [1,2,3,4]
     print ("函数内取值: ", mylist)
     return
     
    # 调用changeme函数
    mylist = [10,20,30]
    changeme( mylist )
    print ("函数外取值: ", mylist)

    结果

    函数内取值: [1, 2, 3, 4]
    函数外取值: [10, 20, 30]

    Mr.Wang

    992***[email protected]

    9年前 (2017年11月21日)
  5. #0

    Rosevil1874

    157***[email protected]

    186

    对于变量作用域,变量的访问以 L(Local) –> E(Enclosing) –> G(Global) –>B(Built-in) 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。

    观察以下几个例子,均从内部函数输出变量 x:

    1. 局部作用域

    x = int(3.3)
    x = 0
    def outer():
     x = 1
     def inner():
     x = 2
     print(x)
     inner()
    outer()

    执行结果为 2,因为此时直接在函数 inner 内部找到了变量 x。

    2.闭包函数外的函数中

    x = int(3.3)
    x = 0
    def outer():
     x = 1
     def inner():
     i = 2
     print(x)
     inner()
    outer()

    执行结果为 1,因为在内部函数 inner 中找不到变量 x,继续去局部外的局部——函数 outer 中找,这时找到了,输出 1。

    3.全局作用域

    x = int(3.3)
    x = 0
    def outer():
     o = 1
     def inner():
     i = 2
     print(x)
     inner()
    outer()

    执行结果为 0,在局部(inner函数)、局部的局部(outer函数)都没找到变量 x,于是访问全局变量,此时找到了并输出。

    4. 内建作用域

    x = int(3.3)
    g = 0
    def outer():
     o = 1
     def inner():
     i = 2
     print(x)
     inner()
    outer()

    执行结果为 3,在局部(inner函数)、局部的局部(outer函数)以及全局变量中都没有找到变量x,于是访问内建变量,此时找到了并输出。

    Rosevil1874

    157***[email protected]

    9年前 (2017年12月13日)
  6. #0
    102

    函数内可以访问全局变量,但不能更新(修改)其值!

    例 :

    a = 10
    def sum ( n ) :
     n += a
     print ('a = ', a, end = ' , ' )
     print ( 'n = ', n )
     
    sum(3)

    输出 :

    a = 10 , n = 13

    如果引用了还没更新的值则会报错 :

    a = 10
    def sum ( n ) :
     n += a
     a = 11
     print ('a = ', a, end = ' , ' )
     print ( 'n = ', n )
     
    sum(3)

    输出 :

    ...
    UnboundLocalError: local variable 'a' referenced before assignment

    可以加上 global 引用以更新变量值 :

    a = 10
    def sum ( n ) :
     global a
     n += a
     a = 11
     print ('a = ', a, end = ' , ' )
     print ( 'n = ', n )
    sum ( 3 )
    print ( '外 a = ', a )

    输出:

    a = 11 , n = 13 外 a = 11

    9年前 (2017年12月28日)
  7. #0

    FVortex

    hty***[email protected]

    64

    函数也可以以一个函数为其参数:

    def hello () :
     print ("Hello, world!")
    def execute(f):
     "执行一个没有参数的函数"
     f()
    execute(hello)

    输出:

    Hello, world!

    FVortex

    hty***[email protected]

    8年前 (2018年02月16日)
  8. #0

    Mr.Wu

    928***[email protected]

    81

    可以通过 函数名.__doc__ 的方式来显示函数的说明文档,感觉这个如果在阅读比较大的程序时应该会有用,同时也在提示自己在写函数时注意添加文档说明。

    def add(a,b):
     "这是 add 函数文档"
     return a+b
    print (add.__doc__)

    输出结果为:

    这是 add 函数文档

    更多内容可参考:Python 文档字符串(DocStrings)

    Mr.Wu

    928***[email protected]

    8年前 (2018年07月20日)
  9. #0

    Mr.Wu

    928***[email protected]

    99

    函数返回值的注意事项: 不同于 C 语言,Python 函数可以返回多个值,多个值以元组的方式返回:

    def fun(a,b): 
     "返回多个值,结果以元组形式表示"
     return a,b,a+b
    print(fun(1,2))
    

    输出结果为:

    (1, 2, 3)
    Mr.Wu

    Mr.Wu

    928***[email protected]

    8年前 (2018年07月20日)
  10. #0

    sprinkle

    117***[email protected]

    49

    函数的装饰器

    在不改变当前函数的情况下, 给其增加新的功能:

    def log(pr):#将被装饰函数传入
     def wrapper():
     print("**********") 
     return pr()#执行被装饰的函数
     return wrapper#将装饰完之后的函数返回(返回的是函数名)
    @log
    def pr():
     print("我是小小洋")
    pr()

    回调函数和返回函数的实例就是装饰器。

    更多内容可参考:Python 函数装饰器

    sprinkle

    117***[email protected]

    8年前 (2018年07月28日)
  11. #0

    1.内部函数,不修改全局变量可以访问全局变量

    a = 10
    def test():
     b = a + 2 #仅仅访问全局变量 a
     print(b)
    test()

    输出结果为:

    12

    2.内部函数,修改同名全局变量,则python会认为它是一个局部变量(同教程最后一个例子)

    #!/usr/bin/python3
     
    a = 10
    def test():
     a = a + 1 #修改同名的全局变量,则认为是一个局部变量
     print(a)
    test()

    3.在内部函数修改同名全局变量之前调用变量名称(如print sum),则引发Unbound-LocalError

    Null 8年前 (2018年09月06日)
  12. #0

    richael

    ric***[email protected]

    24

    在这里补充一点关于 global 和 nonlocal 的知识:

    nonlocal 只能修改外层函数的变量而不能修改外层函数所引用的全局变量,给一个例子如下:

    x = 0
    def outer():
     global x
     x = 1 
     def inner():
     nonlocal x
     x = 2 
     print(x)
     inner()
    outer()
    print(x)

    结果会报错:

    line 6
     nonlocal x
     ^
    SyntaxError: no binding for nonlocal 'x' found

    richael

    ric***[email protected]

    8年前 (2018年12月06日)
  13. #0

    爱睡觉的猫

    199***[email protected]

    59

    global 关键字会跳过中间层直接将嵌套作用域内的局部变量变为全局变量:

    测试代码如下:

    num = 20
    def outer():
     num = 10
     def inner():
     global num
     print (num)
     num = 100
     print (num)
     inner()
     print(num)
    outer()
    print (num)
    结果如下:
    20
    100
    10
    100

    爱睡觉的猫

    199***[email protected]

    8年前 (2019年01月16日)
  14. #0

    濤聲依舊

    152***[email protected]

    26

    Python 定义一个 class 可以编写一个它的构造函数 _init_() 其中形参 self 在实例化时相当于 myname:

    class demo:
     name = ""
     def _init_(self):
     self.ex()
     self.start()
     def inputName(self):
     global name
     name = input("輸入您的姓名:")
     def getFirstName(self):
     if len(name) <= 0:
     x = "別鬧!請輸入姓名!"
     return x
     else:
     x = name[0]
     return x
     def getLastName(self):
     if len(name) <= 1:
     y = "別鬧!長度不夠!"
     return y
     else:
     y = name[1:]
     return y
    myname = demo()
    myname.inputName()
    print(myname.getFirstName())
    print(myname.getLastName())

    濤聲依舊

    152***[email protected]

    7年前 (2019年03月07日)
  15. #0

    fanchen

    227***[email protected]

    41

    函数的参数分为形参实参

    1. 什么是形参

    对于函数来说,形式参数简称形参,是指在定义函数时,定义的一个变量名。

    下面的代码中,x、y、z 就是形参。

    #定义函数
    def foo(x, y, z):
     print("x=", x)
     print("y=", y)
     print("z=", z)
    #调用函数
    foo(1,3,5) #此处的1,3,5是实参

    输出结果:

    x= 1
    y= 3
    z= 5

    形参的作用:是用来接收调用函数时输入的值。

    2. 什么是实参

    对于函数来说,实际参数简称实参。

    是指在调用函数时传入的实际的数据,这会被绑定到函数的形参上。

    函数调用时,将值绑定到变量名上,函数调用结束,解除绑定,并且实参将不再存在于程序中。

    foo(5,2,0)

    上面的 5、 2 和 0 都是实参。

    fanchen

    227***[email protected]

    7年前 (2019年05月23日)
  16. #0

    べ断桥烟雨ミ

    Leg***[email protected]

    88

    在编写函数的过程中,可以显式指定函数的参数类型及返回值类型:

    #!/usr/bin/env python3
    # -*- coding: UTF-8 -*-
    def function_demo(param_A: int, param_B: float, param_C: list, param_D: tuple) -> dict:
     pass

    这种 "将数据类型写死在代码中" 的行为在集成开发环境/代码编辑器时尤为方便,通过显式地指定函数的参数类型和返回值,能够让智能补全组件提前获知标识符的数据类型,提供有利的辅助开发功能。

    べ断桥烟雨ミ

    Leg***[email protected]

    7年前 (2019年09月29日)
  17. #0

    李宇

    146***[email protected]

    32

    对于上面提到的向函数中传递函数对象的用法,我这里进一步补充。

    1.向函数传递的函数本身可以是有参数的:

    def demo(*p):
     i=0
     for var in p:
     var(i)
     i+=1
    def d1(i):
     print("这里是第一个子函数,输入的数是",i)
    def d2(i):
     print("这里是第二个子函数,输入的数是",i)
    def d3(i):
     print("这里是第三个子函数,输入的数是",i)
    def d4(i):
     print("这里是第四个子函数,输入的数是",i)
    demo(d1,d2,d3,d4)

    上面的代码执行起来没问题。

    2.就算你的函数是有参数的,将这个函数传递给另一个函数的时候也不能加参数,还是上面的例子:

    demo(d1(7),d2,d3,d4)

    这样就会报错,因为此时 d1(7) 就是 d1() 的返回值,是不可以在方法内部传递参数并且调用。

    李宇

    146***[email protected]

    7年前 (2020年01月24日)
  18. #0

    zppet

    zpp***sina.com

    23

    关于函数参数能不能在函数里被改变。

    我自己的理解是:如果函数内部出现过赋值语句,则意味着新的对象被生成,函数入参所指向的对象就改变了。这时,再改变,也只是操作的新生成的对象。

    测试代码如下:

    #!/usr/bin/python3
    # -*-coding:utf-8 -*-
    # 可写函数说明
    def changeme( mylist ):
     "修改传入的列表"
     b=mylist
     print(id(b))
     print(id(mylist))
     mylist[1]="Hello World!"
     print ("函数内取值1: ", mylist)
     print("b:",b)
     mylist.append([1,2,3,4])
     #mylist=[1,2,3,4] 
     print ("函数内取值2: ", mylist,b)
     mylist=[11,21,31,41] 
     print ("函数内取值3: ", mylist,b)
     return
     
    # 调用changeme函数
    mylist = [10,20,30]
    changeme( mylist )
    print ("函数外取值: ", mylist)

    输出结果:

    55061120
    55061120
    函数内取值1: [10, 'Hello World!', 30]
    b: [10, 'Hello World!', 30]
    函数内取值2: [10, 'Hello World!', 30, [1, 2, 3, 4]] [10, 'Hello World!', 30, [1, 2, 3, 4]]
    函数内取值3: [11, 21, 31, 41] [10, 'Hello World!', 30, [1, 2, 3, 4]]
    函数外取值: [10, 'Hello World!', 30, [1, 2, 3, 4]]

    zppet

    zpp***sina.com

    6年前 (2020年12月15日)
  19. #0

    shs1992shs

    457***[email protected]

    14

    针对楼上 @IS 的关于函数内部可以访问全局变量,但是不能更新(修改)其值。经过测试,其实函数内部是可以修改全局变量的,测试代码如下:

    1、访问全局变量:

    a = 10
    def sum ( n ) :
     n += a # 调用全局变量a
     print ('a = ', a, end = ' , ' )
     print ( 'n = ', n )
    sum(3)

    输出 :

    a = 10 , n = 13

    2、在函数内部重新赋值全局变量,再次调用:

    a = 10
    def sum ( n ) :
     a = 20 # 重新赋值
     n += a # 调用全局变量a
     print ('a = ', a, end = ' , ' )
     print ( 'n = ', n )
    sum(3)

    输出 :

    a= 20 , n = 23

    3、如果函数内部调用了全局变量,但之后又修改了该变量,则会报错(引发 UnboundLocalError) :

    a = 10
    def sum ( n ) :
     n += a # 调用了全局变量a,但是之后又修改了a,引发错误,若将a=11注释掉则不会报错,或将a=11语句置于调用语句之前也不会报错
     a = 11 # 修改了全局变量
     print ('a = ', a, end = ' , ' )
     print ( 'n = ', n )
    sum(3)

    输出 :

    ...
    UnboundLocalError:local variable 'a' referenced before assignment

    4、如果函数内部调用了全局变量之前已经重新赋值了该全局变量,则在调用之后,再次修改其值,也不会报错

    a = 10
    def sum ( n ) :
     a = 20 # 修改了全局变量
     n += a # 调用了全局变量a
     a = 11 # 再次修改全局变量
     print ('a = ', a, end = ' , ' )
     print ( 'n = ', n )
    sum(3)

    输出 :

    a= 11 , n = 23

    5、可以加上 global 引用以更新变量值:

    a = 10
    def sum ( n ) :
     global a
     n += a
     a = 11
     print ('a = ', a, end = ' , ' )
     print ( 'n = ', n )
    sum ( 3 )
    print( '外a = ', a )

    输出:

    a =11 , n = 13 外 a = 11

    shs1992shs

    457***[email protected]

    6年前 (2020年12月29日)
  20. #0

    codeduck1

    cod***[email protected]

    232

    建议楼上搞懂什么是全局变量和局部变量再来写评论,简直是误人子弟。

    a = 10 # 此处a是声明全部变量
    def sum ( n ) :
     a = 20 # 此处a是声明局部变量,局部变量会随着方法出栈而消失(闭包除外)
     n += a # 此处调用的是局部变量a
     print ('a = ', a, end = ' , ' )
     print ( 'n = ', n )
    a = 10
    def sum ( n ) :
     n += a # 此处引用全局变量a, 注意:这个函数内并没有声明局部变量a
     a = 11 # 此处修改全局变量a, 必然会报错!如要函数内修改全部变量,用global声明就不会报错
     print ('a = ', a, end = ' , ' )
     print ( 'n = ', n )

    楼上下面的函数也是,不一 一描述。。。

    codeduck1

    cod***[email protected]

    5年前 (2021年03月23日)

点我分享笔记

  • 昵称 (必填)
  • 邮箱 (必填)
  • 引用地址

AltStyle によって変換されたページ (->オリジナル) /