函数的类型¶

函数的类型¶

在Python中,函数根据用途和定义方式可以分为不同的类型。常见的函数类型包括:内置函数、自定义函数、匿名函数和递归函数。每种类型的函数都有其特定的用途和用法。

1. 内置函数¶

Python 提供了许多内置函数,可以直接使用,无需定义。以下是一些常用的内置函数示例:

In [ ]:
# # 使用内置函数
#print('这是一个内置函数的例子')  # 输出字符串
numbers = [1, 2, 3, 4, 5]
length = len(numbers)  # 使用内置函数 len() 获取列表长度
maximum = max(numbers)  # 使用内置函数 max() 获取最大值
print(f'列表的长度是:{length}')
print(f'列表中的最大值是:{maximum}')

#help()

在上面的例子中,我们使用了内置函数print、len和max。内置函数是Python标准库的一部分,可以直接调用。

📌 常用内置函数¶

函数名 作用 示例
abs() 绝对值 abs(-5) # 5
all() 全为 True all([True, 1]) # True
any() 至少一个 True any([0, 3]) # True
bool() 转布尔值 bool(0) # False
chr() 整数转字符 chr(65) # 'A'
enumerate() 枚举索引和值 list(enumerate(['a','b']))
float() 转浮点数 float('3.14')
format() 格式化 format(3.1415, '.2f')
getattr() 获取属性 getattr(obj, 'name')
hasattr() 判断属性 hasattr(obj, 'age')
int() 转整数 int('42')
isinstance() 类型判断 isinstance(5, int)
len() 长度 len('hi') # 2
list() 转列表 list('abc')
map() 映射 list(map(str, [1, 2]))
max() 最大值 max([1, 5])
min() 最小值 min([1, 5])
print() 打印输出 print('Hi')
range() 数字序列 range(5)
round() 四舍五入 round(3.1415, 2)
set() 创建集合 set([1, 2, 2])
sorted() 排序 sorted([3, 1])
str() 转字符串 str(123)
sum() 求和 sum([1, 2, 3])
tuple() 转元组 tuple([1, 2])
type() 类型 type(3)
zip() 打包 list(zip([1,2], ['a','b']))

📌 次常用内置函数¶

函数名 作用 示例
bin() 转二进制 bin(5) # '0b101'
bytearray() 创建字节数组 bytearray('hi','utf-8')
bytes() 创建字节对象 bytes('hi','utf-8')
callable() 是否可调用 callable(len)
classmethod() 定义类方法 @classmethod
compile() 编译代码 compile('3+4','','eval')
complex() 复数 complex(2, 3)
delattr() 删除属性 delattr(obj, 'x')
dict() 创建字典 dict(a=1, b=2)
dir() 属性/方法列表 dir(str)
divmod() 商和余数 divmod(7, 3)
eval() 执行表达式 eval('3+5')
exec() 执行代码 exec("a=5")
filter() 过滤 filter(lambda x: x>0, [1,-2])
frozenset() 不可变集合 frozenset([1,2])
globals() 全局变量 globals()
hash() 哈希值 hash('abc')
help() 帮助文档 help(len)
hex() 十六进制 hex(255)
id() 内存地址 id(123)
input() 用户输入 input('姓名:')
iter() 迭代器 iter([1,2])
locals() 局部变量 locals()
memoryview() 内存视图 memoryview(b'abc')
next() 迭代器下一个 next(iter([1,2]))
oct() 八进制 oct(8)
open() 打开文件 open('file.txt')
ord() 字符转整数 ord('A')
pow() 幂运算 pow(2,3)
property() 属性方法 @property
repr() 字符串表示 repr('abc')
reversed() 反向迭代器 reversed([1,2])
slice() 切片对象 slice(1, 5, 2)
staticmethod() 静态方法 @staticmethod
super() 调用父类 super().__init__()

2. 自定义函数¶

自定义函数是由用户定义的函数,用于执行特定的任务。

In [ ]:
# 定义和调用自定义函数
def greet(name):
    print(f'你好,{name}!欢迎学习Python函数!')

# 调用自定义函数
greet('SISUer')

在这个例子中,我们定义了一个名为greet的自定义函数,它接受一个参数name,并输出一条欢迎信息。

(1)无参数无返回值函数¶

这类函数不需要输入参数,也不返回任何值,通常用于执行某些固定操作。用于执行固定操作、不依赖外部输入,也不需要结果返回的情况。 例如:显示欢迎语、提示信息。

In [ ]:
# 示例:打印今天的课程提醒
def daily_reminder():
    print("今天的课程是:Python函数类型,请按时上课哦~")

# 调用函数
daily_reminder()

(2)有参数无返回值函数¶

这类函数需要输入参数,但不返回值,通常用于打印、修改或处理外部数据。

In [ ]:
# 示例:打印某位文豪的代表作
def show_author_work(author, work):
    print(f"《{work}》是{author}的重要代表作。")

# 调用示例
show_author_work("鲁迅", "阿Q正传")

(3)无参数有返回值函数¶

这类函数不接收参数,但会返回一个值。用于内部生成结果并返回给外部使用,不依赖输入。 例如:生成每日语录、返回当前日期。

In [ ]:
# 示例:返回一个每日文艺语录
def get_quote():
    return "生活就像海洋,只有意志坚强的人才能到达彼岸。"

# 调用函数并打印返回值
quote = get_quote()
print("今日语录:", quote)

(4) 有参数有返回值函数¶

这类函数既接收参数,也返回值,是最常用的一种函数类型。 例如:判断年份是否重要、计算两个年份的差值。

In [ ]:
#根据输入的两个年份计算历史事件相隔几年
def years_between(year1, year2):
    return abs(year1 - year2) # abs()

gap = years_between(1840, 1949)
print(f"两次重大历史事件相隔 {gap} 年。")
In [ ]:
#判断句子是否为感叹句(以“!”结尾)
def is_exclamatory(sentence):
    return sentence.endswith("!")

result = is_exclamatory("太美了!")
print("是感叹句吗?", result)
In [ ]:
# 输入作者、年份、书名,返回参考文献格式
def format_reference(author, year, title):
    return f"{author}({year}).《{title}》.北京:人民出版社。"

# 示例
print(format_reference("费孝通", 1985, "乡土中国"))
In [ ]:
# 示例:根据输入的年份判断是否是中国近代史重要年份
def is_historical_year(year):
    important_years = [1911, 1949, 1978]
    return year in important_years

# 调用函数
year = 1949
if is_historical_year(year):
    print(f"{year} 是中国近代史上的重要年份。")
else:
    print(f"{year} 不是特别关键的年份。")
In [ ]:
#需要多举几个例子

3. 匿名函数(Lambda函数)¶

匿名函数是一种没有名字的函数,通常用于需要一个简单函数的场合。它使用关键字lambda定义。

In [ ]:
# 使用 lambda 定义匿名函数
square = lambda x: x * x
result = square(10)
print(f'10 的平方是:{result}')

在这个例子中,我们使用lambda关键字定义了一个匿名函数square,它计算一个数的平方。匿名函数通常用于简单的计算或作为参数传递给其他函数。

In [ ]:
### 练习  按照名字长度对历史人物排序

names = ["", "杜甫", "欧阳修", "辛弃疾", "苏轼"]
# 使用 lambda 按照名字长度排序
sorted_names = sorted(names, key=lambda x: len(x))
print("按名字长度排序结果:", sorted_names)

# 掌握如何根据字符串长度进行排序。适用于文学人物、作者姓名整理等任务。

4. 递归函数¶

递归函数是一个调用自身的函数,通常用于解决分解问题,比如阶乘计算或斐波那契数列。

In [ ]:
# 使用递归定义阶乘函数
def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n - 1)

# 调用递归函数
result = factorial(7)
print(f'5 的阶乘是:{result}')

在这个例子中,factorial函数是一个递归函数,它计算一个整数的阶乘。如果n等于1,则返回1;否则返回n乘以n-1的阶乘。

练习¶

  1. 使用内置函数sum计算一个列表中所有元素的和。
  2. 定义一个自定义函数calculate_triangle_area,接受底和高作为参数,返回三角形的面积。
  3. 使用lambda函数定义一个计算两个数乘积的匿名函数。
  4. 定义一个递归函数fibonacci,计算第n个斐波那契数。

练习参考答案¶

In [ ]:
# 练习 1: 使用内置函数求和
numbers = [1, 2, 3, 4, 5]
total = sum(numbers)
print(f'列表中所有元素的和是:{total}')
In [ ]:
# 练习 2: 计算三角形面积的自定义函数
def calculate_triangle_area(base, height):
    return (base * height) * 0.5

area = calculate_triangle_area(10, 6)
print(f'三角形的面积是:{area}')
In [ ]:
# 练习 3: 使用 lambda 定义乘积函数
multiply = lambda a, b: a * b
product = multiply(4, 8)
print(f'4 和 7 的乘积是:{product}')
In [ ]:
# 练习 4: 斐波那契数的递归函数
def fibonacci(n):
    if n <= 1:
        return n
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)

fib_number = fibonacci(6)
print(f'第 6 个斐波那契数是:{fib_number}')
In [ ]:
#补充时间函数 + 随机函数

练习题¶

请尝试完成以下练习:

  1. 定义一个函数,输入国家名,输出该国家的首都(可以用条件语句)。
  2. 定义一个函数,判断输入的历史人物是否出现在指定列表中。
  3. 使用 lambda 函数将一组书名按字符数排序。
  4. 定义一个返回当前课程信息的无参有返回值函数。

5 随机函数¶

Python 提供 random 模块用于生成随机数、抽样、洗牌等操作,常用于模拟、抽签、问卷等场景。

random%E5%87%BD%E6%95%B0.png

In [20]:
import random

# 生成 1 到 100 的随机整数
# print("随机整数:", random.randint(1, 100))

# 从列表中随机抽取一个文豪名字
authors = ["鲁迅", "胡适", "老舍", "冰心", "沈从文"]
#print("随机抽取一位文豪:", random.choice(authors))

# # # 模拟抽签(不重复地抽3位)
print("抽签选出3位演讲代表:", random.sample(authors, 3))
抽签选出3位演讲代表: ['鲁迅', '胡适', '老舍']
In [27]:
### 示例:生成今日文艺学习任务

tasks = ["阅读一首诗", "抄写一段散文", "观看纪录片", "整理读书笔记", "欣赏一幅画"]
task = random.choice(tasks)
print("今日文艺学习任务:", task)
今日文艺学习任务: 阅读一首诗

练习随机点名,抽签¶

场景:课堂上,老师需要随机选一名学生回答问题

使用方法:

老师运行这个程序

程序会随机显示一个学生名字

被选中的学生站起来回答问题

In [28]:
import random

# 班级学生名单
students = ["小明", "小红", "小刚", "小丽", "小强"]

# 随机抽一名学生回答问题
print("今天回答问题的是:", random.choice(students))
今天回答问题的是: 小明
In [32]:
import random  # 导入随机模块

# 学生名单(可以自行添加或修改)
students = ["小明", "小红", "小刚", "小芳", "小李"]

student = random.choice(students)  # 从学生名单中随机选择一个
print(f"👏 被点到的同学是:{student}")
👏 被点到的同学是:小红
In [ ]:
import random  # 导入随机模块

# 学生名单(可以自行添加或修改)
students = ["小明", "小红", "小刚", "小芳", "小李"]

# 签的内容
draws = ["今天回答问题", "下次带作业", "表现优秀,奖励一颗星", "提个问题给大家", "下次做小组长"]

# 随机点名
def random_name():
    student = random.choice(students)  # 从学生名单中随机选择一个
    print(f"👏 被点到的同学是:{student}")

# 抽签
def random_draw():
    draw = random.choice(draws)  # 从签中随机抽取
    print(f"🎲 抽签结果是:{draw}")

# 主程序
print("------欢迎使用随机点名与抽签系统------")
random_name()
random_draw()
In [ ]:
 

6 时间函数¶

Python 中处理时间的常用模块是 time 和 datetime。

函数 描述
time() 返回当前时间的时间戳(1970纪元后经过的浮点秒数)
ctime([secs]) 将时间戳转换为可读字符串
asctime([t]) 将时间元组转换为可读字符串
localtime([secs]) 将时间戳转换为本地时间的时间元组
gmtime([secs]) 将时间戳转换为UTC时间的时间元组
mktime(t) 将时间元组转换为时间戳
sleep(secs) 推迟执行线程的时间,单位为秒
strftime(format[, t]) 将时间元组格式化为字符串
strptime(string, format) 将字符串解析为时间元组

Python datetime 模块常用函数与方法表¶

函数 / 方法 描述
datetime.datetime.now() 获取当前本地日期和时间,返回 datetime 对象
datetime.datetime.utcnow() 获取当前 UTC 日期和时间,返回 datetime 对象
datetime.datetime.today() 获取当前本地日期和时间,等同于 now()
datetime.datetime.fromtimestamp(ts) 将时间戳转换为本地时间对应的 datetime 对象
datetime.datetime.utcfromtimestamp(ts) 将时间戳转换为 UTC 时间对应的 datetime 对象
datetime.datetime.strptime(date_str, format) 将字符串按指定格式转换为 datetime 对象
datetime.datetime.strftime(format) 将 datetime 对象格式化为字符串
datetime.date.today() 获取当前日期(年月日),返回 date 对象
datetime.time() 创建时间对象(小时、分钟、秒、微秒)
datetime.timedelta(days=0, seconds=0, ...) 用于表示时间间隔,可进行加减运算
In [35]:
import time
from datetime import datetime

# 当前时间戳
print("当前时间戳:", time.time())

# # 当前本地时间(格式化)
print("当前本地时间:", time.strftime("%Y-%m-%d %H:%M:%S"))

# # 获取当前具体时间对象
now = datetime.now()
print("当前年份:", now.year)
print("当前月份:", now.month)
print("当前日期:", now.day)
当前时间戳: 1745398994.3246825
当前本地时间: 2025-04-23 17:03:14
当前年份: 2025
当前月份: 4
当前日期: 23
In [36]:
from datetime import datetime, timedelta

now = datetime.now()
print("当前时间:", now)

dt = datetime.strptime("2025-04-07 15:30", "%Y-%m-%d %H:%M")
print("字符串转时间对象:", dt)

future = now + timedelta(days=7)
print("7天后的时间:", future)

formatted = now.strftime("%Y年%m月%d日 %H:%M:%S")
print("格式化时间:", formatted)
当前时间: 2025-04-23 17:03:32.251077
字符串转时间对象: 2025-04-07 15:30:00
7天后的时间: 2025-04-30 17:03:32.251077
格式化时间: 2025年04月23日 17:03:32
In [ ]:
### 示例:记录阅读文章所用时间
In [ ]:
# 模拟记录阅读文章所花的时间
start = time.time()
input("请按回车键开始阅读《论语》片段...")
input("阅读完毕后请按回车键...")
end = time.time()

duration = end - start
print(f"你大约阅读了 {duration:.2f} 秒。")

练习题¶

请完成以下练习,巩固时间函数与随机函数的使用:

  1. 使用 time 模块编写一个函数,记录你朗读一段文字所用的时间。
  2. 使用 datetime 获取并打印今天是星期几。
  3. 使用 random 模拟从5位作者中随机选出2位进行对谈。
  4. 自定义一个“文艺任务生成器”,随机选择主题、形式、时间段组合成一句完整的学习建议。
In [ ]:
import time

# 1. 朗读计时器
print("===== 朗读计时器 =====")
input("请准备好朗读以下文字,按回车键开始:\n")
text = "Python是一种广泛使用的高级编程语言,以其简洁易读的语法而闻名。"
print(f"请朗读以下文字:\n{text}")

start_time = time.time()
input("朗读完成后按回车键结束计时:")
end_time = time.time()

duration = end_time - start_time
print(f"你朗读这段文字用了 {duration:.2f} 秒")
In [ ]:
#import time
import datetime
# 2. 获取今天是星期几
print("\n===== 今天是星期几 =====")
today = datetime.datetime.now()
weekdays = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
print(f"今天是 {weekdays[today.weekday()]}")
In [38]:
# 3.从5位作者中随机选出2位进行对谈
import random
print("\n===== 随机选择两位作者 =====")
authors = ["鲁迅", "老舍", "巴金", "茅盾", "沈从文"]
selected = random.sample(authors, 2)
print(f"随机选出的两位作者是:{selected[0]} 和 {selected[1]}")
===== 随机选择两位作者 =====
随机选出的两位作者是:巴金 和 鲁迅
In [37]:
# 4. 文艺任务生成器
print("\n===== 文艺任务生成器 =====")
themes = ["春天", "城市", "童年", "爱情", "孤独"]
forms = ["写一首诗", "画一幅画", "创作一篇短文", "拍一组照片", "写一首歌"]
times = ["清晨", "午后", "黄昏", "深夜", "周末"]

theme = random.choice(themes)
form = random.choice(forms)
time_period = random.choice(times)

print(f"学习建议:在{time_period},尝试用{form}来表达'{theme}'这个主题")
===== 文艺任务生成器 =====
学习建议:在清晨,尝试用创作一篇短文来表达'童年'这个主题
In [ ]: