【Python】函数的定义和调用、形参和实参、函数的返回值、多元赋值、全局和局部变量

简介: 【Python】函数的定义和调用、形参和实参、函数的返回值、多元赋值、全局和局部变量

函数的定义

函数的定义:分配任务

def 函数名(形参列表):
  函数体
  return 返回值
  • defdefine,定义
  • 形参列表中,可以有多个形参,它们之间使用逗号分隔
  • 函数体要带一级缩进,带有缩进的代码,才能算是函数的内部语句
  • 函数执行到 return 就代表执行完了,后面跟的值就是函数的返回值。return 语句不是必须得,可有可无

函数的调用

函数的调用:开始完成任务

函数名(实参列表)
  • 实参列表,简称实参,此处写的实参的个数要和形参的个数匹配
def test():  
    print('hello')  
    print('hello')  
    print('hello')  
# 调用函数
test()
"""
运行结果
hello
hello
hello
"""
  • 函数调用才会真正执行函数体里面的代码
  • 函数经过一次定义之后,可以被调用多次
  • Python 中要求,函数定义写在前面,调用在后面,“先定义,再使用

形参和实参

举一个例子:

我有一个朋友

高中的时候,是一个学霸

通过是一个非常漂亮的女生

他们的关系非常好,

但是因为一些原因,最终没能在一起


这个朋友,其实 就是我

  • 在这里面,“我有一个朋友“ 就是形参,“” 就是实参
  • 函数的调用是可以有多次的,每次调用的实参,也是可以不同的
  • 函数的实参,就是在函数调用的时候,要赋值给形参
def calcSum(beg, end):  
    theSum = 0  
    for i in range(beg, end + 1):  
        theSum += i  
    print(theSum)  
  
  
# 求 1-100 的和  
calcSum(1,100)  
# 求 300-400 的和  
calcSum(300,400)
"""
运行结果
5050
35350
"""

C++/Java 里面,不光要求实参和形参的个数要匹配,还要求类型也匹配。但是在 Python 里面,只要求个数,对类型没有要求(动态类型)

def test(x, y):
  return x + y
test(10, 20)
test(12.4, 11.5)
test('hello', 'world')
"""
运行结果
30
23.9
helloworld
"""
  • 也不是说传入什么类型都可以,只要保证传入的参数类型,在函数体里面能够支持对应的运算操作即可(字符串和数字就不能一起)

函数的返回值

函数的参数可以视为是函数的 “输入”, 则函数的返回值, 就可以视为是函数的 “输出” .

此处的 “输入”, “输出” 是更广义的输入输出, 不是单纯指通过控制台输入输出.

我们可以把函数想象成一个 “工厂”. 工厂需要买入原材料, 进行加工, 并生产出产品.

函数的参数就是原材料, 函数的返回值就是生产出的产品.

一个 return

beg-end 之间的数的和:

def calcSum(beg, end):  
    theSum = 0  
    for i in range(beg, end + 1):  
        theSum += i  
    return theSum  
  
  
result = calcSum(1,100)  
print(result)
  • 此处的求和代码,在calcSum内部只进行了计算,而把打印的逻辑放到了函数的外面,calcSum把计算结果当做返回值,返回给“函数的调用者
  • 这里把函数里面算好的 5050 赋值给了 result 变量
  • 在实际开发中,一般更倾向于这种写法。
  • 一个通用的编程原则:一个函数只做一件事

解耦合

  • 在一个稍微复杂一点的程序中,经常会涉及到很多个模块,模块之间可能要进行交互
  • 交互就会带来耦合,我们希望通过良好的设计让耦合尽量低

  • 你和你的女朋友,耦合就比较强,一方产生变动,对另一方影响就非常大
  • 比如你的女朋友生病了,你就要去照顾她,去陪她
  • 你和你的其他普通女性朋友之间的耦合就几乎为 0,一方产生变动,对另一方几乎没啥影响
  • 如果这个朋友生病了,你肯定不会去照顾她,你甚至都不会知道

多个 return

一般多个 return 语句是搭配:分支语句/循环语句

def isOdd(num):  
    if num % 2 == 0:  
        return False  
    else:  
        return True  
  
  
print(isOdd(10))  
print(isOdd(19))
"""
运行结果
False
True
"""
  • isOdd是在判断输入的数字是不是奇数
  • 是,返回
  • 不是,返回
def Odd(num):
  if num % 2 == 0:
    return False
  return True
  • 这个代码逻辑和上面的逻辑是等价的
  • 当函数执行到 return 的时候就不再继续向下执行了,而是回到了调用位置(函数结束了)
  • return True 写到 if 外面,意味着不管条件是否满足,都会执行 return True,但是仔细观察,就会发现当条件满足之后,if 里面有一个 return 了, 所以一旦条件满足,就会执行 if 里面的 return,函数就结束了,就没有机会执行到外面的 return

Python 中的一个函数可以返回多个值,是非常香的特征,C++/Java 都馋哭了

  • C++/Java 中调用一个函数一次只能返回一个值
  • C++要想返回多个值,可以通过输出型参数(指针/引用)
  • Java 要想返回多个值,需要把多个值给包装成一个对象,然后再返回这个对象

多元赋值

def getPoint():  
    x = 10  
    y = 20  
    return x, y  
  
  
a, b = getPoint()
  • 这里就将 x 赋值给了 a,将 y 赋值给了 b

Golang 在设计的时候也把这个机制给引用进去了

虽然现在返回了多个值,但是我只想用其中一部分,不关注其他的

  • 可以使用 _ 来进行占位
def getPoint():  
    x = 10  
    y = 20  
    return x, y  
  
  
_, b = getPoint()
  • 不要 x 了,只要 y,把 y 赋值给 b 即可

变量作用域

def getPoint():  
    x = 10  
    y = 20  
    return x, y  
  
  
x, y = getPoint()
  • 在这个代码中, 函数内部存在 x, y, 函数外部也有 x, y.
  • 但是这两组 x, y 不是相同的变量, 而只是恰好有一样的名字.
  • 比如说,你喊你的女朋友“宝贝”,你的朋友喊他女朋友也是“宝贝”
  • 但是这两个“宝贝”是不同的,这是在各自不同的范围
  • 你喊你的女朋友“宝贝”,是在你俩的圈子里
  • 你朋友喊你的女朋友“宝贝”,是在他俩的圈子里
  • 你们俩在各自圈子里互不影响

函数内的变量

一个变量的有效范围是一定的,只在一个固定的区域内生效

函数内部的变量只在函数内部生效,出了函数就失效了

def getPoint():  
    x = 10  
    y = 20  
    return x, y  
  
  
getPoint()  
print(x,y)

全局变量和局部变量

虽然名字相同,实际上是不同的变量.

x = 10  
def test():  
    x = 20  
    print(f'函数内部 x = {x}')  
  
  
test()  
print(f'函数外部 x = {x}')
"""
运行结果
函数内部 x = 20
函数外部 x = 10
"""
  • 外面的 x全局变量,是在整个程序中都有效的
  • 函数里面的 x局部变量,只在函数内部有效
x = 10  
def test():  
    print(f'x = {x}')  
  
  
test()
"""
运行结果
x = 10
"""
  • 在函数里读取全局变量是可以的
  • 当函数中尝试访问某个变量的时候,会先尝在局部变量中查找,如果找到,就直接访问
  • 如果没有找到,就向上一级作用域中进行查找,test 再往上一级,就是全局了

修改全局变量

如果是想在函数内部修改全局变量的值,需要使用 global 关键字声明

x = 10  
def test():  
    global x  
    x = 20  
  
  
test()  
print(f'x = {x}')
"""
运行结果
x = 20 
"""
  • 如果没有 global,此时就会把 x = 10 当做是在函数内部创建了一个局部变量 x,但实际上是要修改全局变量 x
  • 为了让函数里面知道这里的 x 是一个全局变量,就是用 global 关键字先声明一下

if,else,whilefor 这些关键字也会引入“代码块”,但是这些代码块不会对变量的作用域产生影响,上述语句中的代码块内部定义的变量,可以在外面被访问

for i in range(1, 3):  
    print(i)  
  
  
print('---------------')  
print(i)
"""
1
2
---------------
2
"""
  • C++/Java 中只要是 { } 就会影响到作用域,而 Python 不会,Python 中只有函数能影响作用域


相关文章
WK
|
9天前
|
Python
Python数返回值
在Python中,函数可以通过`return`语句返回一个值或多个值(通过元组)。返回值可以是任何数据类型,如整数、字符串、列表、字典等。如果没有`return`语句或返回`None`,函数将返回`None`。多个值通过返回元组并解包来实现。函数中的多个`return`语句会导致函数在执行到第一个时立即结束。
WK
11 4
|
8天前
|
测试技术 数据安全/隐私保护 Python
探索Python中的装饰器:简化和增强你的函数
【10月更文挑战第24天】在Python编程的海洋中,装饰器是那把可以令你的代码更简洁、更强大的魔法棒。它们不仅能够扩展函数的功能,还能保持代码的整洁性。本文将带你深入了解装饰器的概念、实现方式以及如何通过它们来提升你的代码质量。让我们一起揭开装饰器的神秘面纱,学习如何用它们来打造更加优雅和高效的代码。
|
10天前
|
弹性计算 安全 数据处理
Python高手秘籍:列表推导式与Lambda函数的高效应用
列表推导式和Lambda函数是Python中强大的工具。列表推导式允许在一行代码中生成新列表,而Lambda函数则是用于简单操作的匿名函数。通过示例展示了如何使用这些工具进行数据处理和功能实现,包括生成偶数平方、展平二维列表、按长度排序单词等。这些工具在Python编程中具有高度的灵活性和实用性。
|
13天前
|
Python
python的时间操作time-函数介绍
【10月更文挑战第19天】 python模块time的函数使用介绍和使用。
18 4
|
14天前
|
存储 Python
[oeasy]python038_ range函数_大小写字母的起止范围_start_stop
本文介绍了Python中`range`函数的使用方法及其在生成大小写字母序号范围时的应用。通过示例展示了如何利用`range`和`for`循环输出指定范围内的数字,重点讲解了小写和大写字母对应的ASCII码值范围,并解释了`range`函数的参数(start, stop)以及为何不包括stop值的原因。最后,文章留下了关于为何`range`不包含stop值的问题,留待下一次讨论。
13 1
|
6月前
|
Python
如何在Python中定义生成器函数?
【2月更文挑战第20天】【2月更文挑战第60篇】如何在Python中定义生成器函数?
35 0
|
Python
python字符串切分连接(输入一个包含多个单词的英文句子,单词间以空格分隔,标点符号后跟一个空格。定义一个函数,功能是用指定的符号把单词连接起来。)
python字符串切分连接(输入一个包含多个单词的英文句子,单词间以空格分隔,标点符号后跟一个空格。定义一个函数,功能是用指定的符号把单词连接起来。)
1058 0
|
Python
【Python】定义函数求解一元二次方程
【Python】定义函数求解一元二次方程
339 0
|
Python
Python总结,定义函数(3)
Python总结,定义函数(3)
150 0
Python总结,定义函数(3)
|
Python
Python基础 变量的作用域(python变量的定义位置) 函数(递归函数)斐波那契数列
python变量定义的位置会让变量有不同的作用域,其中包括全局可使用的全局变量,和函数内定义的,只能函数内使用的局部变量。可以用特殊方法使局部变量变成全局变量。
Python基础 变量的作用域(python变量的定义位置)    函数(递归函数)斐波那契数列