Python 用函数实现代码复用
认识 Python 的函数
函数是一段具有特定功能的、可重复使用的代码块,它能够提高程序的模块化和代码的复用率。一个较大的程序,通常需要合理的划分程序中的功能模块,功能模块在程序设计语言中被称为函数。
使用函数有两个目的:
- 分解问题,将一个大问题或者大功能分解成多个小问题,降低编程难度,使问题更容易解决
- 避免编写重复代码
1、函数的定义和调用
在 Python 中,使用 def 关键字来定义函数,而函数调用通过调用语句来实现,调用语句所在的程序或函数称为调用程序或调用函数。
# 函数的定义和声明
# 函数的定义
def print_line():
print("**************************")
def print_text():
print("这是一句话 ")
# 函数的调用
print_line()
print_text()
print_line()
# 输出:
# **************************
# 这是一句话
# **************************
2、函数的参数和返回值
在 Python 中,参数的类型很多,有形式参数(形参),实际参数(实参),必备参数、关键字参数、默认参数、不定长参数。
- 形参和实参
形参: 使用 def 语句来定义函数时,函数名后面的圆括号中的参数就是形式参数(形参)。形参只能是变量,只有函数被调用时才分配内存单元,调用结束时释放所分配的内存单元。
实参: 调用函数时,函数名后面的圆括号中的参数。实参可以是常量、变量、表达式,在实施函数调用时,实参必须有确定的值。
示例如下:
# 使用 max() 函数,求两个数中值较大的数
def max(a,b):
if a > b:
return a
else:
return b
x = int(input("输入数字a = "))
y = int(input("输入数字b = "))
z = max(x,y) # 调用函数
print("较大的数为:",z)
# 输出:
# 输入数字a = 3
# 输入数字b = 6
# 较大的数为: 6
在这个例子中,max() 函数括号内的 a,b 就是该函数的形参,而调用该函数时,括号内的 x 和 y 则是传递给该函数的实参。
- 必备参数
必备参数须以正确的顺序传入函数,调用函数时,输入的实参和形参的顺序要一致,实参数量必须和声明函数时形参的数量一样,不然会出现语法错误。
示例如下:
# 必备参数
def print_text(x,y):
print(x,y)
print_text("Hello","World")
print_text("Hello") # 会报错
# 输出:
# Hello World
# Traceback (most recent call last):
# File "c:\Gitee\python\03_Day\03_function.py", line 7, in <module>
# print_text("Hello") # 会报错
# TypeError: print_text() missing 1 required positional argument: 'y'
- 关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。使用关键字参数允许函数调用时参数的顺序和声明不一致,因为 Python 解释器能够用参数名匹配参数值。
示例代码如下:
# 关键字参数
def fun(discount,price): # 定义函数
print("商品折扣:",discount)
print("商品价格:",price)
return
fun(price= 100,discount= 0.5) # 关键字参数传递
# 输出:
# 商品折扣: 0.5
# 商品价格: 100
- 默认参数
在定义函数时,可以为函数的某个形参赋予默认值,这个参数被称为默认值参数。带有默认值参数的函数示例如下:
# 默认值参数
def fun(discount,price = 100):
print("商品折扣:",discount)
print("商品价格:",price)
return
fun(0.5)
# 输出:
# 商品折扣: 0.5
# 商品价格: 100
在调用 fun() 函数时,只输入一个实参值。从结果知道,尽管实参没有输入具体值,price 仍然会按定义时的默认值输出。
值得注意的是:在定义有默认值参数的函数时,只能将默认值赋给最右端的参数,否则会出现语法错误。
def fun(discount = 0.5,price):
print("商品折扣:",discount)
print("商品价格:",price)
return
fun(100)
# 输出:
# File "c:\Gitee\python\03_Day\05_function.py", line 3
# def fun(discount = 0.5,price):
# ^^^^^
# SyntaxError: non-default argument follows default argument
- 不定长参数
在使用函数时,若希望一个函数能够处理比定义时更多的参数,即参数数量是可变的,那么可以在函数中使用不定长参数。与上面几种参数相区别的是,不定长参数在声明时,形参不会命名。
在函数的第一行参数列表最右侧增加一个带有 * 的参数,基本语法格式为:
def 函数名([形参列表,] * args):
函数体
其中,* args 用来接收任意多个实参并将其放在一个元祖(tuple)中供函数使用。
# 不定长参数
def f(x, y, * args):
print(x)
print(y)
print(args)
f(10,9,8,7,6,5,4,3,2,1)
# 输出:
# 10
# 9
# (8, 7, 6, 5, 4, 3, 2, 1)
不懂怎么应用,多余的参数都被 args 接收,后面用到了详解
- 函数的返回值
在 Python 中,函数使用 return 语句返回值,选择性地向调用方返回一个表达式。return 语句用来退出函数并将程序返回到函数被调用的位置继续执行,可以返回0个,1个或一组值。函数返回的值被称为返回值,基本语法结构为:
return [返回值列表]
其中,return 语句可以在函数体的任何位置出现,return 语句是可选的,如果有 return 语句,但是 return 后面没有接表达式或者值的,则返回 None;如果没有 return 语句,则会自动返回 None。
# 函数的返回值
def fun(discount,price):
price = price * discount
print("商品折扣:",discount)
print("商品价格:",price)
return price;
price = fun(0.5,100)
# 输出:
# 商品折扣: 0.5
# 商品价格: 50.0
3、递归函数
Python 支持函数的递归调用,所谓递归就是自己函数直接或间接的调用其本身。
举个例子:
# 递归:在纸上执行遍就懂了
def f(n):
if n == 1:
return 1
else:
return f(n-1)*n # 先是调用自己,全部完成后逐步 返回值
n = int(input("请输入一个正整数:"))
print(n,"的阶乘为:",f(n))
# 输出:
# 请输入一个正整数:3
# 3 的阶乘为: 6

4、匿名函数
lambda 函数用于定义简单的、能够一行内表示的函数。
示例如下:
sum = lambda arg1,arg2:arg1 + arg2;
print("total:",sum(20,50))
# 输出:
# 70
5、变量的作用域
变量的作用域就是变量的使用范围,程序的运行离不开变量。
一个程序的所有变量并不是在哪个位置都可以访问的,访问权限取决于这个变量是在哪里赋值。
在 Python 中,根据变量的作用域的不同,分成 全局变量 和 局部变量 。定义在函数内的变量,只能在函数内部使用,作用范围仅在函数内部的变量,称为局部变量。在函数之外定义的变量称为全局变量,全局变量在整个程序内起作用。
示例如下:
# 变量的作用域
price = 200
def fun(discount,price):
price = price * discount
print("函数内局部变量价格为:",price)
return price
fun(0.5,200)
print("函数外全局变量价格为:",price)
# 输出:
# 函数内局部变量价格为: 100.0
# 函数外全局变量价格为: 200
6、Python 内置函数常用归纳表
- Python 内置函数表
| 分类 | 函数名 | 功能说明 | 简单示例 |
|---|---|---|---|
| 基础输入输出 | print() |
输出内容到控制台,支持字符串格式化 | print("姓名:%s" % "Tom") → 姓名:Tom |
input() |
从控制台获取用户输入,返回字符串类型 | age = input("请输入年龄:") → 接收字符串输入 |
|
| 类型转换 | str() |
将其他类型转换为字符串(核心) | str(123.45) → "123.45";str(True) → "True" |
int() |
将数字字符串转换为整数 | int("100") → 100 |
|
float() |
将数字字符串转换为浮点数 | float("3.14") → 3.14 |
|
bytes() |
将字符串转换为字节对象(指定编码) | bytes("Python", encoding="utf-8") → b'Python' |
|
list() |
将字符串拆分为字符列表 | list("abc") → ["a", "b", "c"] |
|
| 序列/集合操作 | len() |
计算字符串长度(最常用) | len("Hello Python") → 11 |
sorted() |
对字符串字符按Unicode排序,返回列表 | sorted("bac") → ["a", "b", "c"] |
|
enumerate() |
遍历字符串的索引和字符 | for i, c in enumerate("ab"): print(i, c) → 0 a、1 b |
|
| 字符串专用内置函数 | ord() |
将单个字符转换为对应的Unicode编码值 | ord("A") → 65;ord("中") → 20013 |
chr() |
将Unicode编码值转换为对应的字符 | chr(65) → "A";chr(20013) → "中" |
|
ascii() |
返回对象的ASCII表示,非ASCII字符用\u/\U转义 |
ascii("中") → "'\u4e2d'" |
|
format() |
内置格式化函数(与字符串format()方法功能一致) |
format(3.1415, ".2f") → "3.14" |
|
| 数学计算 | max() |
获取字符串中字符的最大Unicode值 | max("abc") → "c" |
min() |
获取字符串中字符的最小Unicode值 | min("abc") → "a" |
|
| 对象判断与标识 | type() |
判断对象是否为字符串类型 | type("abc") → <class 'str'> |
isinstance() |
判断对象是否为字符串实例 | isinstance("abc", str) → True |
|
| 文件操作 | open() |
读取/写入字符串到文件(指定编码) | with open("test.txt", "w", encoding="utf-8") as f: f.write("测试") |
| 其他常用 | eval() |
执行字符串中的Python表达式(慎用,避免安全风险) | eval("'a'+'b'") → "ab" |
repr() |
返回对象的官方字符串表示(保留原始格式) | repr("abc\n") → "'abc\n'"(区别于str()的直观表示) |
- 常用字符串方法表
| 方法名 | 功能说明 | 简单示例 |
|---|---|---|
strip() |
去除字符串首尾的空白字符(空格、换行、制表符),可指定去除的字符 | " abc \n".strip() → "abc";"###abc###".strip("#") → "abc" |
lstrip() |
去除字符串左侧的空白字符或指定字符 | " abc".lstrip() → "abc" |
rstrip() |
去除字符串右侧的空白字符或指定字符 | "abc ".rstrip() → "abc" |
split() |
按指定分隔符拆分字符串为列表,默认按空白字符拆分 | "a,b,c".split(",") → ["a","b","c"];"a b c".split() → ["a","b","c"] |
join() |
将可迭代对象(列表、元组)的字符串元素用指定分隔符连接为一个字符串 | ",".join(["a","b","c"]) → "a,b,c" |
replace() |
将字符串中的指定子串替换为新子串,可指定替换次数 | "abac".replace("a", "x") → "xbxc";"abac".replace("a", "x", 1) → "xbac" |
lower() |
将字符串所有字符转为小写 | "Python".lower() → "python" |
upper() |
将字符串所有字符转为大写 | "Python".upper() → "PYTHON" |
startswith() |
判断字符串是否以指定子串开头(支持指定起始/结束位置) | "Python".startswith("Py") → True;"Python".startswith("th", 2) → True |
endswith() |
判断字符串是否以指定子串结尾(支持指定起始/结束位置) | "Python".endswith("on") → True |
find() |
查找子串在字符串中的首次出现位置,找不到返回-1(比index()更安全) |
"abcabc".find("bc") → 1;"abc".find("d") → -1 |
index() |
查找子串的首次出现位置,找不到抛出ValueError |
"abcabc".index("bc") → 1 |
count() |
统计子串在字符串中出现的次数 | "abac".count("a") → 2 |
splitlines() |
按换行符拆分字符串为列表(处理多行文本) | "a\nb\nc".splitlines() → ["a","b","c"] |
format() |
字符串格式化(替代%格式化,更灵活) | "姓名:{},年龄:{}".format("Tom", 18) → "姓名:Tom,年龄:18" |
f-string |
Python3.6+ 特性,字符串前缀f,直接嵌入变量(最简洁的格式化方式) |
name="Tom"; f"姓名:{name}" → "姓名:Tom" |
isdigit() |
判断字符串是否全为数字字符(0-9) | "123".isdigit() → True;"123a".isdigit() → False |
isalpha() |
判断字符串是否全为字母字符 | "abc".isalpha() → True;"abc123".isalpha() → False |
isspace() |
判断字符串是否全为空白字符 | " \n\t".isspace() → True |
capitalize() |
将字符串首字符转为大写,其余转为小写 | "python".capitalize() → "Python" |
title() |
将字符串每个单词的首字符转为大写 | "hello world".title() → "Hello World" |
center() |
将字符串居中,指定总长度,填充指定字符(默认空格) | "abc".center(5, "-") → "-abc-" |
zfill() |
字符串左侧补0,达到指定长度(常用于数字格式化) | "123".zfill(5) → "00123" |
replace() |
替换子串(重复列,强调重要性) | 同上 |
写在最后
内置函数比较多,记住常用的就行

浙公网安备 33010602011771号