Python中的函数和模块
函数是功能相对独立且会重复使用的代码的封装。
1. 标准库中的模块和函数
函数 | 说明 |
---|---|
abs | 返回一个数的绝对值,例如:abs(-1.3) 会返回1.3 。 |
bin | 把一个整数转换成以'0b' 开头的二进制字符串,例如:bin(123) 会返回'0b1111011' 。 |
chr | 将Unicode编码转换成对应的字符,例如:chr(8364) 会返回'€' 。 |
hex | 将一个整数转换成以'0x' 开头的十六进制字符串,例如:hex(123) 会返回'0x7b' 。 |
input | 从输入中读取一行,返回读到的字符串。 |
len | 获取字符串、列表等的长度。 |
max | 返回多个参数或一个可迭代对象(后面会讲)中的最大值,例如:max(12, 95, 37) 会返回95 。 |
min | 返回多个参数或一个可迭代对象(后面会讲)中的最小值,例如:min(12, 95, 37) 会返回12 。 |
oct | 把一个整数转换成以'0o' 开头的八进制字符串,例如:oct(123) 会返回'0o173' 。 |
open | 打开一个文件并返回文件对象(后面会讲)。 |
ord | 将字符转换成对应的Unicode编码,例如:ord('€') 会返回8364 。 |
pow | 求幂运算,例如:pow(2, 3) 会返回8 ;pow(2, 0.5) 会返回1.4142135623730951 。 |
print | 打印输出。 |
range | 构造一个范围序列,例如:range(100) 会产生0 到99 的整数序列。 |
round | 按照指定的精度对数值进行四舍五入,例如:round(1.23456, 4) 会返回1.2346 。 |
sum | 对一个序列中的项从左到右进行求和运算,例如:sum(range(1, 101)) 会返回5050 。 |
type | 返回对象的类型,例如:type(10) 会返回int ;而type('hello') 会返回str 。 |
2. 全局变量和局部变量
全局变量:没有写在任何函数里面的变量
局部变量:定义在函数内的变量
python程序中搜索一个变量是按照 LEGB 顺序进行搜索的:
Local(局部作用域)-->Embeded(嵌套作用域)-->
Global(全局作用域)-->Built-in(内置作用域)
global-->声明使用全局变量或者定义一个局部变量将其放到全局作用域
nonlocal-->声明使用嵌套作用域的变量(不使用局部变量)
3. 例子—骰子游戏
玩家摇两颗色子,如果第一次摇出了7点或11点,玩家胜;如果摇出了2点、3点、12点,庄家胜;如果摇出了其他的点数,游戏继续,玩家重新摇色子;如果玩家摇出了第一次摇的点数,玩家胜;如果玩家摇出了7点,庄家胜;如果玩家摇出其他点数,游戏继续,玩家重新摇色子,直到分出胜负。
游戏开始之前,玩家有1000元的初始资金,玩家可以下注,赢了获得下注的金额,输了就扣除下注的金额,游戏结束的条件是玩家把钱输光。
import random
def roll_dice(num):
"""
摇骰子
:param num: 骰子的数量
:return:摇出的点数
"""
total=0
for _ in range(num):
total+=random.randrange(1,7)
return total
def win():
"""
玩家赢
:return:
"""
global money
print('玩家胜利')
money += zhuma
def lose():
global money
print('庄家胜利')
money -= zhuma
money = 1000
while money > 0:
print(f'玩家总资产为{money}元.')
zhuma = 0
while zhuma <= 0 or zhuma > money:
try:
zhuma = int(input('请下注: '))
except ValueError:
pass
first_point=roll_dice(2)
print(f'玩家摇出了{first_point}点。')
if first_point in (7, 11):
win()
elif first_point in (2, 3, 12):
lose()
else:
while True:
curr_point=roll_dice(2)
print(f'玩家摇出了{curr_point}点')
if curr_point==first_point:
win()
break
elif curr_point==7:
lose()
break
print('玩家已破产')
4. 例子—双色球随机选号
红色球01-33,选择不重复的6个球,按从小到大排列
蓝色球01-16,选择一个球,跟在红色球的后面
import random
def generate():
"""
生成一组彩票号码
:return:
"""
red_ball = [i for i in range(1, 34)]
blue_ball = [i for i in range(1, 17)]
# 无放回抽样
select_balls = random.sample(red_ball, 6)
select_balls.sort()
select_balls += random.sample(blue_ball, k=1)
return select_balls
def display(balls):
"""
显示一组彩票号码
:param balls: 装彩票号码对应的球的列表
:return:
"""
for ball in balls:
print(f'{ball:0>2d}', end=' ')
print()
n=int(input('机选几注:'))
for _ in range(n):
display(generate())
5.例子—随机验证码
写一个实现生成指定长度的随机验证码(有数字和英文字母构成)的函数。
写好了之后,通过调用该函数,生成10组随机验证码
import random
import string
def get_captcha_code(length: int=4) ->str:# : int=4) ->str 类型标注
"""
生成随机验证码
:param length: 验证码的长度
:return: 随机验证码字符串
"""
selected_chars=random.choices(string.digits+string.ascii_letters,k=length)
return ''.join(selected_chars)
for _ in range(10):
print(get_captcha_code())
6. 例子—输出2-100范围内的质数
def is_prime(num):
"""
判断一个正整数是不是质数
:param num: 正整数
:return: 如果是质数返回True,否则返回False
"""
for i in range(2,int(num**0.5)+1):
if num % i==0:
return False
return num!=1 and True
for n in range(2,100):
if is_prime(n):
print(n,end=' ')
7. 例子—求极差、均值、方差、标准差、中位数
def ptp(data):
"""求极差(全距)"""
return max(data)-min(data)
def average(data):
"""求均值"""
return sum(data)/len(data)
def variance(data):
"""求方差"""
x_bar = average(data)
total=0
for num in data:
total+=(num-x_bar)**2
return total / (len(data)-1)
def standard_deviation(data):
"""求标准差"""
return variance(data)**0.5
def median(data):
"""求中位数"""
temp=sorted(data)
size=len(temp)
if size % 2 != 0:
return temp[size//2]
else:
return average(temp[size//2-1:size//2+1])
8. 总结
-
一般返回布尔值的命名:前面加is
-
写程序的终极原则:高内聚,低耦合。—>high cohesion low coupling
设计函数最重要的原则:单一职责原则(一个函数只做好一件事情)–高度内聚 -
函数sort()排序会打乱原来的顺序 ,而sorted()排序不会打乱顺序,返回
-
解决命名冲突:
Python中的from、import、as关键字专门用来处理包和模块导入的操作,as可以用来取别名。
(1)如果要使用其他模块中的定义函数,可以先通过import导入模块,然后通过“模块名.函数名()”的方式调用函数;
(2)还有一种做法是直接 从模块中导入函数–>‘from 模块 import 函数名’–>直接通过函数名调用函数