13. function
1. 函数的定义
计算机中的函数————代码片段
- 一段具有特定功能的、可重复使用的代码
- 用函数名来表示并通过函数名来完成功能调用
2. 使用函数的意义
- 代码的重复利用
- 减少程序中的代码重复量,使代码更加容易被理解;
- 让代码更易于维护与更新
3. 函数的使用
- 内置函数:
- Python 编程语言中已经被定好功能的函数
- 可以直接调用来执行特定的任务
- 用户自定义函数
- 函数功能和使用方法都由用户决定
3.1 使用一个函数
- python 中有许多的内置函数,我们可以直接使用他们,
如:
输出函数 print()
获取用户输入的函数 input()
类型转换的函数 int() float() str()……
除了内置函数外,Python还有内置的标准函数库
- 当我们把这些额外函数库导入我们程序里时,我们可以用这些函数库提供的方法
访问这些函数时需要以库名.函数名的方式来使用
import math
a = math.sqrt(2)
print(a)
import random
a = random.randint(0, 10)
print(a)
3.1.1 random
import random
# 生成随机浮点数
# 返回一个随机浮点数,范围在 [0.0, 1.0]
print(random.random())
# 返回一个随机浮点数,范围在 [5.5, 25.5]
print(random.uniform(5.5, 25.5))
# 生成随机整肃
# 返回一个随机整数,范围在 [10, 20] 之间
print(random.randint(10, 20))
# 返回一个随机整数,范围在 [0, 100] 之间,步长为 5
print(random.randrange(0, 101, 5))
# 选择和洗牌
# 从列表中随机选择一个元素
my_list = [1,2,3,4,5]
print(random.choice(my_list))
# 从列表中根据权重随机选择三个元素
print(random.choices(my_list, weights=[10,1,1,1,1], k=3))
# 打乱列表
random.shuffle(my_list)
print(my_list)
# 生成特定分布的随机数
# 返回一个符合高斯分布(均值为 0,标准差为 1)的随机浮点数
print(random.gauss(0, 1))
import random
# 设置随机种子
random.seed(1) # 里面的数字可以写任何数
# 这将产生相同的随机数序列
print(random.random())
print(random.randint(1, 100))
3.1.2 math
import math
# 正弦值
angle_radius = math.pi / 2
print('sin(π/2) = ', math.sin(angle_radius))
# 余弦值
print('cos(0) = ', math.cos(0))
# 正切值
print('tan(π/4)=', math.tan(math.pi / 4))
# 反正弦值
print('asin(1) =', math.asin(1))
# 反余弦值
print('acos(0)=', math.acos(0))
# 反正切值
print('atan(1) =', math.atan(1))
# 自然数 e 的 x 次方
print('exp(1) =', math.exp(1))
# x 的自然对数
print('log(e) =', math.log(math.e))
# x 的以 10 为底的对数
print('log10(100) =' , math.log10(100))
# x 的 y 次幂
print('pow(2, 3) =', math.pow(2, 3))
# x 的平方根
print('sqrt(16) =', math.sqrt(16))
# x 的绝对值
print('fabs(-10) =', math.fabs(-10))
# 向上取整
print('ceil(3.7) =', math.ceil(3.7))
# 向下取整
print('floor(3.7) =', math.floor(3.7))
# 截断取整
print('trunc(3.7) =', math.trunc(3.7))
# 输出自然数和 π
print(math.pi)
print(math.e)
3.2 定义一个函数
def 是 define 的缩写,表示定义一个函数
格式:
def 函数名称():
函数内的语句
当我们需要用这个函数时,直接写‘函数名称 + ()
‘就即可
注意:函数名称中间不要有空格,可以用下划线代替
示例:
def HelloUser():
print('Hello')
HelloUser()
# output
Hello
def HelloUser(username): # username 是参数
print('Hello!' + username)
HelloUser('李雷') # 李雷也是参数
# output
Hello!李雷
传递参数
- 位置参数
# 显示某次考试成绩
def TestGrade(name, grade):
print(name + '的成绩是' + grade + '.')
TestGrade('李雷', '99') # 李雷的成绩是99.
- 关键字参数
# 显示某次考试成绩
def TestGrade(name, grade):
print(name + '的成绩是' + grade + '.')
TestGrade(name = '李雷', grade = '99') # 李雷的成绩是99.
- 返回值
def 函数名称(参数1, 参数2,……):
函数内的语句
……
return 返回内容
加粗部分是必须有的
代码示例:
def say_hi():
print('Hi!')
print('我是ryan')
say_hi()
# output
Hi!
我是ryan
def add(a, b):
sum_number = a + b
return sum_number
value = add(4, 12)
print(value)
- 变量作用域
函数内的变量和外部同名时,函数会优先使用内部变量,若内部没有该变量则使用外部
a = 1
def hello():
a = 2
print(a)
hello()
print(a)
# output
2
1
a = 1
def hello():
print(a)
hello()
print(a)
# output
1
1
a = 1
def hello():
print(a) # 函数内的变量和外部同名时,函数会优先使用内部变量, 但是这里在后面
a = 2
hello()
print(a)
# output
Traceback (most recent call last):
File "C:\Users\Administrator\PycharmProjects\Coder\nonsense\code3.py", line 232, in <module>
hello()
File "C:\Users\Administrator\PycharmProjects\Coder\nonsense\code3.py", line 229, in hello
print(a)
UnboundLocalError: local variable 'a' referenced before assignment
如何防止报错:
引入全局变量 global
a = 1
def hello():
global a
print(a)
a = 2
print(a)
hello()
print(a)
# output
1
1
2
4. 练习
4.1文本倒转与过滤
编写一个函数 reverse_filter
,它接收一个字符串和一组字符,返回将字符串中不包含这些字符的部分倒序后的结果。例如,如果输入字符串为 "hello world",字符集为 {'l', 'o'},则应该返回 "drw eh"。
def reverse_filter(Str, Chr):
List = list(Str)
# 去除包含字符
length = len(List)
for i in range(length):
if List[i] in Chr:
List.pop(i)
i -= 1
return str(List)[::-1]
print(reverse_filter('hello world', {'l','o'}))
def reversed_filter(Str, Chr):
List = list(Str.strip(''))
List_target = []
for i in range(len(Str)):
if List[i] not in Chr:
List_target.append(List[i])
result = ''.join(List_target[::-1])
print(result)
reversed_filter('hello world',['l','o'])
def reverse_filter(text, char_set):
filtered_reversed = ''
for char in reversed(text):
if char not in char_set:
filtered_reversed += char
def reverse_filter(Str, Chr):
List = list(Str)
length = len(List)
i = 0
while i < length:
if List[i] in Chr:
List.pop(i)
else:
i += 1
length = len(List)
return ''.join(List[::-1])
4.2 数字拆分与重组
创建一个函数 split_and_combine
,它接收一个正整数,将其拆分成单个数字,然后根据提供的模式重新组合这些数字。模式可以是 'odd', 'even', 或 'mix'。例如,输入数字为 1234567,模式为 'odd',则应返回所有奇数位上的数字组合,即 1357。
4.3 音节计数器
编写一个函数 syllable_count
,用于计算一个英文句子中的音节总数。这里可以简化音节的计算规则:每个包含元音字母(a, e, i, o, u, y)的连续字母序列算作一个音节。例如,句子 "This is an example." 应该返回6个音节。
4.4 简易计算器
编写一个函数calculator
,用于计算 num1 和 num2 之间通过 notation 之间的计算,其中 notation 可以是 ‘ + , - , * , / ’
def calculator(num1, num2, notation):
if notation in ['+', '-', '*', '/']:
return eval(str(num1) + notation + str(num2))
- 0
- 0
- 0
- 0
- 0
- 0