目录
一、什么是函数
函数是一段可重复使用的代码块,用于执行特定任务。函数可以接受输入参数,并可能返回一个或多个结果。它们提高了代码的可读性和可重用性,同时也使程序更易于维护和扩展。
1、定义函数
定义一个函数
def greet(name):
"""生成一个问候语"""
return f"Hello, {name}!"
# 调用函数
message = greet("Alice")
print(message) # 输出: Hello, Alice!
# def 关键字用于声明一个函数。
# greet 是函数的名字。
# name 是函数的参数,当函数被调用时,你可以传递一个值给它。
# return 语句指定了函数的结果。在这个情况下,函数返回一个字符串,该字符串是由固定文本和传入的 name 参数组成。
2、使用默认参数值
def greet(name, greeting="Hello"): #给greeting一个默认的参数为Hello
return f"{greeting}, {name}!" #这里使用了拼接
# 调用函数
message = greet("Bob", "Hi") # Hi, Bob! #这里调用greet函数,重新给参数值
message = greet("Charlie") # Hello, Charlie!
# 使用关键字参数
message = greet(name="Diana", greeting="Hey") # Hey, Diana!
3、使用不定长参数列表
# *args 是一种特殊的语法,允许你在函数中接收不定数量的位置参数。当你在函数定义中使用星号(*)前缀一个参数名(如 *args),
# 你实际上是在告诉Python这个函数可以接受任意数量的非关键字(位置)参数。
# 这些参数会被Python收集并封装成一个元组(tuple)。这意味着在函数体内部,你可以通过索引或迭代来访问这些参数。
def sum_all(*args):
total = 0
for num in args:
total += num
return total
# 调用函数
result = sum_all(1, 2, 3, 4, 5) # result is 15
# sum_all 函数可以接受任意数量的整数作为参数,并返回它们的总和。由于 args 是一个元组,
# 我们可以使用循环遍历其中的每个元素并累加它们。
二、函数的分类
1、 根据定义来源分类
1.1 内置函数
内置函数(Built-in Functions):这些函数由Python语言本身提供,无需导入任何模块即可使用,如 len(), str(), print() 等。
以下是一部分内置函数
# print() - 打印输出到控制台。
print("Hello, world!")
# len() - 返回容器(如列表、元组、字符串)的长度。
length = len("example")
# int(), float(), str() - 类型转换。
num = int("123")
decimal = float("123.45")
text = str(123)
1.2 标准库函数
标准库函数(Library Functions):这些函数位于Python的标准库中,需要通过导入相应的模块才能使用,如 math.sqrt(), os.listdir() 等。
# 1. os 模块
# os.path.join(): 用于组合路径。
import os
path = os.path.join("folder", "subfolder", "file.txt")
print(path) #输出:folder\subfolder\file.txt
# os.listdir(): 列出指定目录下的所有文件和子目录名。
import os
files = os.listdir(".")
print(files) #输出:['基础函数.py']
# 2. sys 模块
# sys.argv: 获取脚本运行时的命令行参数。
import sys
print(sys.argv)
# 输出: ['D:\\pythonXM\\pythonProject1\\day04\\基础函数.py'],输出文件的路径
# 3. math 模块
# math.sqrt(): 计算平方根。
import math
result = math.sqrt(16)
print(result) #输出:4.0
# math.pi: 圆周率π。
import math
print(math.pi)
# 输出:3.141592653589793
# 4. random 模块
# random.randint(): 生成指定范围内的随机整数。
import random
number = random.randint(1, 10)
print(number)
# 5. datetime 模块
# datetime.now(): 获取当前日期和时间。
from datetime import datetime
now = datetime.now()
print(now)
# 输出:2024-07-23 14:49:19.645480
# datetime.strptime(): 字符串转换为datetime对象。
from datetime import datetime
date_obj = datetime.strptime('Jan 1 2019 2:43PM', '%b %d %Y %I:%M%p')
print(date_obj)
# 输出:2019-01-01 14:43:00
# 6. json 模块
# json.dumps(): 将Python对象编码为JSON字符串。
import json
data = {"name": "John", "age": 30}
json_str = json.dumps(data)
print(json_str)
# json.loads(): 解析JSON字符串,将其转换为Python对象。
import json
data = '{"name": "John", "age": 30}'
python_obj = json.loads(data)
print(data)
# 7. collections 模块
# collections.Counter(): 统计元素出现次数。
from collections import Counter
c = Counter(['a', 'b', 'c', 'a', 'b', 'b'])
print(c)
# 输出:Counter({'b': 3, 'a': 2, 'c': 1})
1.3 用户定义函数
用户定义函数(User-defined Functions):由程序员自己编写的函数,可以在自己的代码中定义和调用。
# 基本语法:
def function_name(parameters):
# 函数体
# 可以执行任何合法的Python语句
return value # 可选,如果函数需要返回值
关键字 def:所有函数定义都以这个关键字开始。 函数名:遵循Python标识符命名规则,最好具有描述性以便于理解。 圆括号:用于传递参数到函数中。这些参数被称为形参(formal parameters)。 冒号:函数头之后的冒号是必需的,它表示函数体的开始。 缩进:函数体中的代码必须被缩进,通常使用四个空格。 return 语句:用于从函数返回值。如果没有明确的return语句,函数会默认返回None。
2、根据参数特性分类
2.1 无参函数
无参函数:不接受任何参数的函数。这是最简单的函数类型,没有参数列表。
def greet():
print("Hello!")
greet() # 调用函数
2.2 有参函数
有参函数:接受一个或多个参数的函数。函数可以接受一个或多个参数作为输入。
def greet_user(name):
print(f"Hello, {name}!")
greet_user("Alice") # 调用函数并传入参数
2.3 位置参数
位置参数:按照参数在函数定义中的顺序传递。参数按照在函数定义中的顺序传递。
def calculate_area(length, width):
return length * width
area = calculate_area(10, 5) # 长度为10,宽度为5
2.4 关键字参数
关键字参数:通过参数名来传递值,可以改变参数的实际顺序。可以通过参数名传递值,这样即使改变了参数的实际顺序也可以正确地赋值。
def calculate_area(length, width):
return length * width
area = calculate_area(width=5, length=10) # 关键字参数调用
2.5 默认参数
默认参数:参数具有默认值,调用时可以省略。参数可以设置默认值,在调用时如果不提供该参数的值,则使用默认值。
def greet_user(name="Guest"):
print(f"Hello, {name}!")
greet_user() # 使用默认参数值
greet_user("Alice") # 覆盖默认参数值
2.6 可变参数
可变参数:使用 *args 和 **kwargs 接收不定数量的位置参数和关键字参数。使用*args接收任意数量的位置参数,使用**kwargs接收任意数量的关键字参数。
def log_message(*args, **kwargs):
print("Positional arguments:", args)
print("Keyword arguments:", kwargs)
log_message("Error", "Warning", level="critical", timestamp="12:00 PM")
3、根据返回值分类
3.1 无返回值函数
无返回值函数:不返回任何值,return 语句可以省略或仅写 return。
def greet():
print("Hello, world!")
# 调用无返回值的函数
greet()
# 尝试捕获返回值(将会是 None)
result = greet()
print(result) # 输出: None
3.2有返回值函数
有返回值函数:函数通过 return 语句返回一个或多个值。
def add(a, b):
return a + b
# 调用有返回值的函数
result = add(5, 3)
print(result) # 输出: 8
# 甚至可以返回多个值,但这实际上是一个包含多个元素的元组:
def get_name_age():
return "Alice", 30
# 调用函数并解包返回值
name, age = get_name_age()
print(name) # 输出: Alice
print(age) # 输出: 30
4、根据作用域分类
4.1 局部函数
局部函数:定义在一个函数体内的函数,只能在包含它的函数内被调用。
def outer_function():
def inner_function(): # 定义局部函数
print("This is an inner function.")
inner_function() # 调用局部函数
outer_function() # 输出: This is an inner function.
4.2 全局函数
全局函数:在模块顶层定义的函数,可以在整个模块中被调用。
def global_function():
print("This is a global function.")
def another_function():
global_function() # 调用全局函数
print(another_function()) # 输出: This is a global function.