认识 Python 的函数
函数是一段具有特定功能的、可重复使用的代码块,它能够提高程序的模块化和代码的复用率。一个较大的程序,通常需要合理的划分程序中的功能模块,功能模块在程序设计语言中被称为函数。
使用函数有两个目的:
- 分解问题,将一个大问题或者大功能分解成多个小问题,降低编程难度,使问题更容易解决
- 避免编写重复代码
1、函数的定义和调用
在 Python 中,使用 def 关键字来定义函数,而函数调用通过调用语句来实现,调用语句所在的程序或函数称为调用程序或调用函数。
# 函数的定义和声明# 函数的定义defprint_line():print("**************************")defprint_text():print("这是一句话 ")# 函数的调用print_line()print_text()print_line()# 输出:# **************************# 这是一句话# **************************2、函数的参数和返回值
在 Python 中,参数的类型很多,有形式参数(形参),实际参数(实参),必备参数、关键字参数、默认参数、不定长参数。
- 形参和实参
形参:使用 def 语句来定义函数时,函数名后面的圆括号中的参数就是形式参数(形参)。形参只能是变量,只有函数被调用时才分配内存单元,调用结束时释放所分配的内存单元。
实参:调用函数时,函数名后面的圆括号中的参数。实参可以是常量、变量、表达式,在实施函数调用时,实参必须有确定的值。
示例如下:
# 使用 max() 函数,求两个数中值较大的数defmax(a,b):ifa>b:returnaelse:returnb x=int(input("输入数字a = "))y=int(input("输入数字b = "))z=max(x,y)# 调用函数print("较大的数为:",z)# 输出:# 输入数字a = 3# 输入数字b = 6# 较大的数为: 6在这个例子中,max() 函数括号内的 a,b 就是该函数的形参,而调用该函数时,括号内的 x 和 y 则是传递给该函数的实参。
- 必备参数
必备参数须以正确的顺序传入函数,调用函数时,输入的实参和形参的顺序要一致,实参数量必须和声明函数时形参的数量一样,不然会出现语法错误。
示例如下:
# 必备参数defprint_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 解释器能够用参数名匹配参数值。
示例代码如下:
# 关键字参数deffun(discount,price):# 定义函数print("商品折扣:",discount)print("商品价格:",price)returnfun(price=100,discount=0.5)# 关键字参数传递# 输出:# 商品折扣: 0.5# 商品价格: 100- 默认参数
在定义函数时,可以为函数的某个形参赋予默认值,这个参数被称为默认值参数。带有默认值参数的函数示例如下:
# 默认值参数deffun(discount,price=100):print("商品折扣:",discount)print("商品价格:",price)returnfun(0.5)# 输出:# 商品折扣: 0.5# 商品价格: 100在调用 fun() 函数时,只输入一个实参值。从结果知道,尽管实参没有输入具体值,price 仍然会按定义时的默认值输出。
值得注意的是:在定义有默认值参数的函数时,只能将默认值赋给最右端的参数,否则会出现语法错误。
deffun(discount=0.5,price):print("商品折扣:",discount)print("商品价格:",price)returnfun(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)中供函数使用。
# 不定长参数deff(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。
# 函数的返回值deffun(discount,price):price=price*discountprint("商品折扣:",discount)print("商品价格:",price)returnprice;price=fun(0.5,100)# 输出:# 商品折扣: 0.5# 商品价格: 50.03、递归函数
Python 支持函数的递归调用,所谓递归就是自己函数直接或间接的调用其本身。
举个例子:
# 递归:在纸上执行遍就懂了deff(n):ifn==1:return1else:returnf(n-1)*n# 先是调用自己,全部完成后逐步 返回值n=int(input("请输入一个正整数:"))print(n,"的阶乘为:",f(n))# 输出:# 请输入一个正整数:3# 3 的阶乘为: 64、匿名函数
lambda 函数用于定义简单的、能够一行内表示的函数。
示例如下:
sum=lambdaarg1,arg2:arg1+arg2;print("total:",sum(20,50))# 输出:# 705、变量的作用域
变量的作用域就是变量的使用范围,程序的运行离不开变量。
一个程序的所有变量并不是在哪个位置都可以访问的,访问权限取决于这个变量是在哪里赋值。
在 Python 中,根据变量的作用域的不同,分成全局变量和局部变量。定义在函数内的变量,只能在函数内部使用,作用范围仅在函数内部的变量,称为局部变量。在函数之外定义的变量称为全局变量,全局变量在整个程序内起作用。
示例如下:
# 变量的作用域price=200deffun(discount,price):price=price*discountprint("函数内局部变量价格为:",price)returnprice fun(0.5,200)print("函数外全局变量价格为:",price)# 输出:# 函数内局部变量价格为: 100.0# 函数外全局变量价格为: 2006、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() | 替换子串(重复列,强调重要性) | 同上 |
写在最后
内置函数比较多,记住常用的就行