函数与模块
课程安排
- python
- linux
- mysql
- 项目+可视化
- java
- redis
- clickhouse
- hadoop
- hive
- zookeeper
- hbase
- 数据采集
- 项目(数据仓库+hive)
- 阿里云
- 项目(数据仓库+阿里云)
- scala
- spark
- flink
- 6个组件
- 项目(2-3)
- 模拟面试
课程回顾与完善
import time
import random
'''
定义一个函数,展示菜单栏
'''
def random_code():
number = random.randint(100000, 999999)
return number
# 定义一个函数发送邮箱
def send_email(receiver_email, info):
# zyxkyiufoghagije
import smtplib
from email.mime.text import MIMEText
from email.header import Header
msg_from = '1165872335@qq.com' # 发送方邮箱
passwd = 'zyxkyiufoghagije' # 填入发送方邮箱的授权码(填入自己的授权码,相当于邮箱密码)
msg_to = receiver_email # 收件人邮箱
# msg_to = ['','','']
subject = '数加系统' # 主题
content = info
# 生成一个MIMEText对象(还有一些其它参数)
msg = MIMEText(content)
# 放入邮件主题
msg['Subject'] = subject
# 也可以这样传参
# msg['Subject'] = Header(subject, 'utf-8')
# 放入发件人
msg['From'] = msg_from
# 放入收件人
# 通过ssl方式发送,服务器地址,端口
s = smtplib.SMTP_SSL("smtp.qq.com", 465)
# 登录到邮箱
s.login(msg_from, passwd)
# 发送邮件:发送方,收件方,要发送的消息
s.sendmail(msg_from, msg_to, msg.as_string())
print('验证码发送成功!!')
def init():
print('欢迎进入数加登录系统'.center(50, '-'))
print('''1.注册\n2.登录\n3.查看用户信息\n
''')
# 写一个公共的获取所有用户的信息,返回一个用户字典
def get_all_users():
# 新建一个字典,存储用户信息
users_dict = {}
# 打开文件
with open('data/users.txt', mode='r', encoding='UTF-8') as f:
content = f.read() # 读取全文的内容
user_list = content.split('\n') # ['root,qwerdf', 'xiaohu,123456', '']
# 最后一个是空字符串
user_list.pop(-1) # ['root,qwerdf', 'xiaohu,123456']
# 遍历列表得到字典
for user in user_list:
# 'root,qwerdf'
users_dict[user.split(',')[0]] = user.split(',')[1]
return users_dict
def register():
print('-' * 50)
print('欢迎注册!!')
while True:
name = input('请输入您的用户名:')
# 验证用户是否重复
users_dict = get_all_users()
if name not in users_dict:
break
print('*******************')
print('该用户名已经被使用!!')
print('*******************')
password = input('请输入您的密码:')
# TODO: 自己加邮箱发送验证码的功能
user_email = input('请输入您的邮箱: ')
# 生成验证码
yzm = random_code()
# 调用发送验证码的功能,发送验证码
send_email(user_email, f'【数加科技】您的验证码是: {yzm}, 在60秒之内使用,请勿泄露给他人。')
yzm_code = input('请输入验证码: ')
if yzm_code != str(yzm):
print('注册失败!!')
return None
with open('data/users.txt', 'a', encoding='UTF-8') as f:
f.write(f'{name},{password}\n')
time.sleep(3)
print(f'{name}用户注册成功!!')
def login():
print('欢迎进入数加登录页面'.center(50, '-'))
username = input('请输入要登录的用户名: ')
# 打开文件,读取用户数据
users_dict = get_all_users()
if username not in users_dict:
print('该用户不存在,请先注册!!')
return None
password = input('请输入密码: ')
if password != users_dict.get(username):
print('登录失败!!')
return None
print('登录成功!!')
def show():
print('当前系统用户信息'.center(50, '-'))
users_dict = get_all_users()
for user in users_dict.items():
print(f'用户名:{user[0]}, 密码:{user[1]}')
if __name__ == '__main__':
# 列出菜单
init()
dict1 = {
'1': register,
'2': login,
'3': show
}
flag = True
while flag:
choice = input('请输入您的选择(1/2/3): ')
if choice not in dict1:
print('没有您所选的选项!重新输入')
continue
fun1 = dict1.get(choice)
fun1()
flag = False
1、内置函数
python内部也提供了大量的函数,可以让我们直接在程序中使用
第一类函数(数学运算相关的) 5个
- abs() 求绝对值
a1 = abs(-10)
print(a1) # 10
- pow() 次方
a1 = pow(2,3) # 计算2的3次方
print(a1) # 8
- sum() 求和
list1 = [1, 2, 3, 4, 5]
res1 = sum(list1)
print(res1)
- divmod() 两个数相除得到一个商,一个余数
a1, b1 = divmod(3, 5)
print(a1) # 商
print(b1) # 余数
- round() 四舍五入保留小数
a1 = round(1.2367538,2)
print(a1)
第二类函数(和聚合相关)
- min() 最小值
a1 = min([21,3,55,62,3,1])
print(a1)
- max() 最大值
a1 = max([21,3,55,62,3,1])
print(a1)
- all 判断一个序列中,是否都是True,
0
''
()
{}
[]
0.0
list1 = [1,2,3,0,5]
res1 = all(list1)
print(res1) # False
- any 只要有一个是True就可以
list1 = [1,2,3,0,5]
res1 = any(list1)
print(res1) # True
list1 = [0.0,1,[],0,()]
res1 = any(list1)
print(res1) # True
第三类函数(和进制相关)
'0b111011' # 二进制
'0100' # 八进制
'100' # 十进制
'0x100' # 十六进制
-
十进制、二进制
- 十进制---> 二进制
a1 = bin(100) print(a1)
- 二进制---> 十进制
a1 = int('0b1100100',2) print(a1)
-
十进制、八进制
- 十进制-->八进制
a1 = oct(100) print(a1) # 0o144
- 八进制-->十进制
res1 = int('0o144',8) print(res1)
-
十进制、十六进制
- 十进制-->十六进制
a1 = hex(100) print(a1) # 0x64
- 十六进制-->十进制
res1 = int('0x64',16) print(res1)
作业1:将自己的IP地址,转换成二进制的形式 (1、将IP地址转2进制 2、传二进制的ip地址转点分十进制)
win+R cmd ipconfig
第四类函数(字符相关)
- ord() 获取对应的ASCII码值
a1 = ord('A')
print(a1)
- chr() 获取ASCII码值对应的字符
a1 = chr(65)
print(a1)
作业2:生成验证码,包含数字和字母
第五类函数(转型相关)
-
int()
-
str()
-
bool()
-
list()
-
tuple()
-
dict()
-
bytes()
name = '小虎'
res1 = name.encode('UTF-8')
print(res1,type(res1)) # b'\xe5\xb0\x8f\xe8\x99\x8e' <class 'bytes'>
res2 = bytes('小虎',encoding='utf-8')
print(res2)
第六类函数(获取属性数据相关)
- len()
- print()
- input()
- open()
- range()
- hash 计算一个值的哈希值(计算存储位置的)
# 相同的数据,哈希值是一样的
print(hash('ABC'))
print(hash('ABC'))
- type() 查看元素的数据类型的
# 数据类型是可以直接使用==进行比较
- callable 判断一个变量是不是一个函数,判断是否可以执行
a1 = 'abc'
res1 = callable(a1)
print(res1) # False
def fun1():
print('hello world')
res1 = callable(fun1)
print(res1) # True
- enumerate() 获取序列中的索引以及元素值
list1 = [11, 22, 33, 44, 55]
for index, value in enumerate(list1):
print(f'{index}.{value}')
- sorted() 排序 产生排序后的新列表
list1 = [11, 2, 14, 45, 16]
res1 = sorted(list1)
print(res1) # [2, 11, 14, 16, 45]
print(list1) # [11, 2, 14, 45, 16]
name_list = ['小虎:1001', '丁义杰:1006', '李超超:1003', '温文涛:1002']
# print(name_list)
def get_key(e):
return int(str(e).split(':')[1])
res1 = sorted(name_list, key=get_key)
print(res1)
2、函数生成器
def fun1(a1):
print(a1)
return a1
fun1()
def fun2(a1): # [11,22,33,44]
print('hello1')
yield a1[0]
print('hello2')
yield a1[1]
print('hello3')
yield a1[2]
print('hello4')
yield a1[3]
# 这里的代码需要再调用一次__next__()函数,但是__next__()必须要取yield后面的值,已经没有yield的了,所以报错
# print('hello5')
res1 = fun2([11, 22, 33, 44])
# print(res1)
a1 = res1.__next__() # yield
print(a1)
a2 = res1.__next__()
print(a2)
a3 = res1.__next__()
print(a3)
a4 = res1.__next__()
print(a4)
a5 = res1.__next__() # StopIteration
print(a5)
def fun2(a1): # [11,22,33,44]
print('hello1')
yield a1[0]
print('hello2')
yield a1[1]
print('hello3')
yield a1[2]
print('hello4')
yield a1[3]
# 这里的代码需要再调用一次__next__()函数,但是__next__()必须要取yield后面的值,已经没有yield的了,所以报错
# print('hello5')
res1 = fun2([11, 22, 33, 44])# 函数生成器可以使用for循环代替调用__next__()函数
for i in res1:
print(i)
这个东西具体有什么用呢?
需求:在不创建列表的前提下,创建1000w个数字
def fun1():
for i in range(1,11):
yield i
3、模块
- 自定义模块 py文件
- 内置模块 time random ...
- 第三方模块 requests lxml ...
3.1 导入模块的方式
- import xxx 直接将大的模块进行导入
- from xxx import xxx 从大的模块中导入小的功能
- as 的方式,对导入的东西的重命名
将来开发的时候,将功能的功能放入到一个模块中,其他的模块要想使用该功能,就必须导入
3.2 易错点!!!!!!!
# 将来定义模块名字的时候,千万不要与内置模块或者与第三方模块重名,会导致功能用不了
random.py
import random
res = random.randint(1000, 9999)
print(res)
4、常用内置模块
4.1 random
import random
# 获取随机的整数
res = random.randint(10, 20) # [10,20]
print(res)
# 获取随机的小数
res2 = round(random.uniform(10, 20), 2)
print(res2)
# 从列表中随机获取一个元素
list1 = [11, 22, 33, 44, 55, 66, 77, 88]
res3 = random.choice(list1)
print(res3)
# 从列表中随机获取n个元素
list1 = [11, 22, 33, 44, 55, 66, 77, 88]
res3 = random.sample(list1,2)
print(res3)
print('-----------------------------')
# 随机打乱顺序
list1 = [11, 22, 33, 44, 55, 66, 77, 88]
random.shuffle(list1)
print(list1)
使用random模块编写一个抽奖小程序
# 使用列表推导式生成一个列表
users_list = [f'学生-小虎{i}' for i in range(13)]
print(users_list)
# 设置奖项以及人数
data_list = [
('特等奖', 1, '华为问界汽车一辆'),
('一等奖', 1, '10万元现金以及问界汽车10元优惠券'),
('二等奖', 3, '华为mate60 pro'),
('三等奖', 5, '华为手表')
]
def choujiang(data_list):
# 开始抽奖
for grade, counts, goods in data_list[::-1]:
print(f'开始抽{grade}'.center(50, '-'))
res_list = random.sample(users_list, counts)
# 将中奖的人从列表中删除
for user in res_list:
users_list.remove(user)
info = f'恭喜{",".join(res_list)}!! 每人获得{goods}奖品!!'
yield info
res = choujiang(data_list)
a1 = res.__next__()
print(a1)
a1 = res.__next__()
print(a1)
a1 = res.__next__()
print(a1)
a1 = res.__next__()
print(a1)
标签:__,users,res1,list1,a1,模块,print
From: https://www.cnblogs.com/peculiar/p/17970566