视频加载失败

Python高级之函数

1377 字
7 分钟
Python高级之函数

【一】函数的基本使用#

  • 基于前一部分的学习,我们已经能开发一些功能简单的小程序了
    • 但随着程序功能的增多,代码量随之增大
    • 此时仍不加区分地把所有功能的实现代码放到一起,将会使得程序的组织结构不清晰,可读性变差,且程序中需要频繁使用同一功能时,只能重复编写该功能的实现代码,日积月累,程序将变得冗长
    • 并且当某一功能需要修改时,又不得不找出所有定义及使用这段功能的地方修改之,管理维护的难度极大
    • 好吧,装了半天逼,到底该如何解决提出的这些问题呢?
  • 我们完全可以从现实生活中找到简化程序设计的方案:
    • 比如一个修理工会事先准备好螺丝刀、锤子等工具,这样在进行修理的过程中
    • 需要用到拧螺丝的功能时就直接拿来螺丝刀使用
    • 需要用到锤击物体的功能时就直接拿来锤子使用,而无需临时制造。
    • 这个例子的核心在于’事先准备好工具’,遇到应用场景时’拿来就用’,。
  • 在程序中,具备某一功能的‘工具’指的就是函数,‘事先准备工具’的过程即函数的定义,‘拿来就用’即函数的调用。

【二】函数的定义和调用#

  • 函数的使用必须遵循’先定义,后调用’的原则。
  • 函数的定义就相当于事先将函数体代码保存起来,然后将内存地址赋值给函数名,函数名就是对这段代码的引用,这和变量的定义是相似的。
  • 没有事先定义函数而直接调用,就相当于在引用一个不存在的’变量名’。
  • 定义函数的语法
def 函数名(参数1,参数2,...):
"""文档描述"""
函数体
return 值
  • def: 定义函数的关键字;
  • 函数名:函数名指向函数内存地址,是对函数体代码的引用。函数的命名应该反映出函数的功能;
  • 括号:括号内定义参数,参数是可有可无的,且无需指定参数的类型;
  • 冒号:括号后要加冒号,然后在下一行开始缩进编写函数体的代码;
  • """文档描述""": 描述函数功能,参数介绍等信息的文档,非必要,但是建议加上,从而增强函数的可读性;
  • 函数体:由语句和表达式组成;
  • return 值:定义函数的返回值,return是可有可无的。

【1】函数的定义#

(0)空函数#

def login():
pass
  • 函数体为pass代表什么都不做,称之为空函数。
  • 定义空函数通常是有用的,因为在程序设计的开始,往往是先想好程序都需要完成什么功能,然后把所有功能都列举出来用pass充当函数体“占位符”,这将使得程序的体系结构立见,清晰且可读性强。
  • 例如要编写一个ftp程序
    • 我们可能想到的功能有用户认证,下载,上传,浏览,切换目录等功能
    • 可以先做出如下定义:
def auth_user():
"""user authentication function"""
pass
def download_file():
"""download file function"""
pass
def upload_file():
"""upload file function"""
pass
def ls():
"""list contents function"""
pass
def cd():
"""change directory"""
pass

(1)无参无返回值#

def interactive():
user=input('user>>: ').strip()
pwd=input('password>>: ').strip()

(2)有参无返回值#

  • 参数是函数的调用者向函数体传值的媒介
def greet(name):
print(f"Hello, {name}!")
greet("Dream") # Output: Hello, Dream!

(3)有多个参数无返回值#

def add_numbers(a, b):
result = a + b
print(f"The sum of {a} and {b} is {result}")
add_numbers(3, 5) # Output: The sum of 3 and 5 is 8

(4)多个参数一个返回值#

# 定义一个函数,函数有两个参数
def add_numbers(a, b):
result = a + b
print(f"The sum of {a} and {b} is {result}")
# 使用 return 关键字将想要返回的结果返回出去
return result
res = add_numbers(3, 5) # Output: The sum of 3 and 5 is 8
print(res) # 8

(5)多个参数多个返回值#

def rectangle_info(length, width):
area = length * width
perimeter = 2 * (length + width)
return area, perimeter
# 解压赋值
area, perimeter = rectangle_info(4, 5)
print(f"Area: {area}, Perimeter: {perimeter}")
# Area: 20, Perimeter: 18

【2】函数的三种调用方式#

(1)直接调用#

def add(x, y):
return x + y
# 直接调用函数,拿到对应的结果
result = add(3, 5)
print(result) # 8

(2)表达式调用#

def subtract(x, y):
return x - y
# 将定义好的函数地址给对应的变量
operation = subtract
# 通过给定的变量进行调用
result = operation(10, 5)
print(result) # 5
def add(a, b):
res = a + b
print(f"这是 add 函数 :>>> {res}")
return res
def subtract(a, b):
res = a - b
print(f"这是 subtract 函数 :>>> {res}")
return res
func_dict = {1: add, 2: subtract}
func_id = input("请输入功能 id :>>>> ")
func = func_dict.get(int(func_id))
a = input("请输入参数 a :>>>> ")
b = input("请输入参数 b :>>>> ")
res = func(int(a), int(b))
print(res)

(3)函数作为参数#

# 【3】触发这个函数 带入参数x 参数y
def multiply(x, y):
# 计算出返回值
return x * y
def operate(func, x, y):
# 【2】函数地址传过来 带参数过来
# 返回值是 函数地址(参数x,参数y)
# 【4】接收到返回值并返回
return func(x, y)
# 【1】operate 函数 有3个参数 : 函数地址 参数x 参数y
result = operate(multiply, 4, 6)
# 【5】拿到返回值
print(result)

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Profile Image of the Author
Dream
Hello, I'm Dream.
公告
欢迎来到我的博客!爱学习爱进步。
分类
标签
最新动态
站点统计
文章
300
分类
5
标签
26
总字数
640,882
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Vercel
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录