1、集合:(补充)
集合特点:
(1)不同元素组成
(2)是无序的
(3)集合中的元素必须是不可变类型(数字,字符串,元组)
def add(self, *args, **kwargs): # real signature unknown
""" ##在集合里面添加内容
Add an element to a set.
This has no effect if the element is already present.
"""
pass
示例:
set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
set1.add('eric')
print(set1)
结果:
def update(self, *args, **kwargs): # real signature unknown
""" ## 类似于列表的extend
Update a set with the union of itself and others. """
pass
示例:
set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
set1.update('狗剩')
print(set1)
结果:
def clear(self, *args, **kwargs): # real signature unknown
""" ##清空集合
Remove all elements from this set. """
pass
示例:
set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
set1.clear()
print(set1)
结果:
def pop(self, *args, **kwargs): # real signature unknown
""" ##随机删除元素
Remove and return an arbitrary set element.
Raises KeyError if the set is empty.
"""
pass
示例:
set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
set1.pop()
print(set1)
结果:
def remove(self, *args, **kwargs): # real signature unknown
""" ##按照元素删除
Remove an element from a set; it must be a member.
If the element is not a member, raise a KeyError.
"""
pass
示例:
set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
set1.remove('alex')
print(set1)
结果:
def difference(self, *args, **kwargs): # real signature unknown
""" ##取两个集合的差集,可以用 “-” 代替
Return the difference of two or more sets as a new set.
(i.e. all elements that are in this set but not the others.)
"""
pass
示例:
set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
set2 = { 'wusir', 'tom', 'egon', 'eric'}
print(set1 - set2)
print(set2 - set1)
结果:
def intersection(self, *args, **kwargs): # real signature unknown
""" ##取两个集合的交集,可以用 “&” 代替
Return the intersection of two sets as a new set.
(i.e. all elements that are in both sets.)
"""
pass
示例:
set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
set2 = { 'wusir', 'tom', 'egon', 'eric'}
print(set1 & set2)
print(set2 & set1)
结果:
def union(self, *args, **kwargs): # real signature unknown
""" ##取两个集合并集,可以用 “|” 表示
Return the union of sets as a new set.
(i.e. all elements that are in either set.)
"""
pass
示例:
set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
set2 = { 'wusir', 'tom', 'egon', 'eric'}
print(set1 | set2)
结果:
def symmetric_difference(self, *args, **kwargs): # real signature unknown
""" #取两个集合的反交集,可以用 “^” 表示
Return the symmetric difference of two sets as a new set.
(i.e. all elements that are in exactly one of the sets.)
"""
pass
示例:
set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
set2 = { 'wusir', 'tom', 'egon', 'eric'}
print(set1 ^ set2)
结果:
def issubset(self, *args, **kwargs): # real signature unknown
""" ##判断一个集合是不是另一个的子集,可以用 “<” 代替
Report whether another set contains this set. """
pass
示例:
set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
set2 = { 'wusir', 'tom', 'egon', 'eric'}
print(set1 < set2)
结果:
def issuperset(self, *args, **kwargs): # real signature unknown
""" ##判断一个集合是不是另一个的父集,可以用 “>” 代替
Report whether this set contains another set. """
pass
示例:
set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
set2 = { 'wusir', 'egon','barry'}
print(set1 > set2)
结果:
2、文件操作
文件操作流程:
(1)通过open()函数调用系统内部的open命令去打开文件
(2)将open的文件赋值给一个变量,这个变量就叫做文件句柄
(3)所有的一切针对文件的操作都是基于这个文件句柄的
(4)简述流程就是:
①、打开文件产生文件句柄
②、然后对文件进行操作
③、关闭文件句柄
案例操作内容:
洞房昨夜停红烛,
待晓堂前拜舅姑。
妆罢低声问夫婿,
画眉深浅入时无?
文件的读:(r模式)
def read(self, *args, **kwargs): # real signature unknown
## 读取文件全部内容
pass
示例:
f1 = open('file1',encoding='utf-8')
f2 = f1.read()
print(f2)
f1.close()
结果:
def readline(self, *args, **kwargs): # real signature unknown
## 读取文件一行内容
pass
示例:
f1 = open('file1',encoding='utf-8')
f3 = f1.readline()
print(f3)
f1.close()
结果:
def readlines(self, *args, **kwargs): # real signature unknown
## 以列表的形式显示文件的全部内容
pass
示例:
f1 = open('file1',encoding='utf-8')
f4 = f1.readlines()
print(f4)
f1.close()
结果:
def readable(self, *args, **kwargs): # real signature unknown
## 判断文件是否可读
pass
示例:
f1 = open('file1',encoding='utf-8')
print(f1.readable())
f1.close()
结果:
文件的写:(w模式)
def write(self, *args, **kwargs): # real signature unknown
## 写内容到文件中,如果没有这个文件则创建,有则修改里面的内容
pass
示例:
f1 = open('file1',encoding='utf-8',mode='w')
f1.write('这是一首好诗。')
f1.close()
结果:
def writable(self, *args, **kwargs): # real signature unknown
## 判断文件是否可写
pass
示例:
f1 = open('file1',encoding='utf-8',mode='w')
print(f1.writable())
f1.close()
结果:
def close(self, *args, **kwargs): # real signature unknown
## 关闭文件
pass ##上面的例子都用了close函数
def flush(self, *args, **kwargs): # real signature unknown
## 强制将新文件刷新到磁盘
pass
def seek(self, *args, **kwargs): # real signature unknown
## 指定在文件中光标的位置
pass
def tell(self, *args, **kwargs): # real signature unknown
## 读取光标在文件中的位置
pass
seek和tell结合示例:
f1 = open('file2',encoding='utf-8',mode='r')
f1.seek(6) ##seek是按字节类型去移动的
print(f1.read())
print(f1.tell())
f1.close()
结果:
def seekable(self, *args, **kwargs): # real signature unknown
## 判断光标是否可移动
pass
示例:
f1 = open('file2',encoding='utf-8',mode='r')
print(f1.seekable())
f1.close()
结果:
def truncate(self, *args, **kwargs): # real signature unknown
## 按照字节对原文件进行截取 必须在a 或 a+ 模式
pass
示例:
f1 = open('file2',encoding='utf-8',mode='a')
f1.truncate(18)
f1.close()
结果:
追加操作:(a模式)
f1 = open('file2',encoding='utf-8',mode='a')
f1.write('\n画眉深浅入时无')
f1.close()
结果:
其他模式介绍:
r+:可读可写,先读取内容,在写入内容,
f1 = open('file2',encoding='utf-8',mode='r+')
print(f1.read().strip())
f1.write('\n好诗')
f1.close()
结果:
读取的内容:
写入的内容:
w+:可读可写,先写再读,清空原来文件的内容,写入新的内容
f1 = open('file2',encoding='utf-8',mode='w+')
f1.write('确实是一首好诗')
f1.seek(0)
print(f1.read())
f1.close()
结果:
a+:可读可写,先追加新的内容到文件最后,在读取内容
f1 = open('file2',encoding='utf-8',mode='a+')
f1.write('洞房昨夜停红烛,\n待晓堂前拜舅姑。\n妆罢低声问夫婿,\n画眉深浅入时无?')
f1.seek(0)
print(f1.read())
f1.close()
结果:
以字节形式读取和写入文件的方法介绍:
rb:以字节形式读取文件内容
wb:以字节的形式写入文件
ab:以字节的形式追加文件
3、函数
在没用函数的时候,普通代码里面重复代码比较多,可读性也比较差,使用函数就可以大大节省代码的书写量。
函数书写格式:
def func():
函数体
return 返回值
func() 执行函数的方式
def 是定义函数的关键字
func 是函数名
return 函数的终止,没指定返回值的情况下返回None,返回值可以指定单个值,也可以指定多个值,但是多个值会放在一个元组中。
模仿len()函数定义一个计算数据类型个数的函数:
s = "asdfghjklqpowirttuy"
def my_len():
num = 0
for i in s:
num += 1
return num
print(my_len())
结果:
函数的传参:
函数的参数分为两种,一种是形参,一种是实参。
形参:①、定义函数时设定的参数为形参
②、在形参中又包括了位置参数,默认参数,动态参数
位置参数:在位置参数中,传的参数和接收的参数要一一对应,不能多也不能少
def para(a,b):
return a+b
print(para(1,2))
结果:
默认参数:接收的参数中如果有默认参数的话,可以不用给默认参数传值,它默认会读取自己的值返回给结果,但也可以给默认参数传一个想要的值。
def para(name,age=18):
return name,age
print(para('eric',22))
结果:
给默认参数传值:
不给默认参数传值:
动态参数:动态参数用*args, **kwargs表示,也叫万能参数。
def func3(*args, **kwargs): #函数的定义的时候 * 代表聚合。
print(args)
print(kwargs)
func3(1, 2, 3, 'alex', c=6, name='wusir', age='21')
位置参数传给了*args,关键字参数传给了**keargs
func3(*[1, 2, 3],*(22, 33)) #函数的执行的时候 * 代表打散。
参数带有一个*的时候,表示所传的值都给*args
func3(**{'name':"alex"},**{'age':23}) #函数的执行的时候 * 代表打散。
参数带有两个*的时候传的值必须以字典的形式传值,传给了**kwargs
func3(1, 2, 3, 22, 33) #函数的执行的时候 * 代表打散。
如果只按位置参数传值的话,所有参数都传给了*args
实参:执行函数时给形参穿的值为实参
在实参中又包含了,位置参数,关键字参数,混合参数
位置参数:传值的参数和接收值的参数必须一一对应,多一个不行,少一个也不行
def para(a,b,c):
return a+b-c
print(para(21,33,41))
结果:
关键字参数:把实参的参数赋值给形参,可以不按顺序传参,但个数不能多也不能少
def para(a,b,c):
print(a*b/c)
para(a=11,c=22,b=19)
结果:
混合参数:在定义实参时,可以将多个位置参数和关键字参数混合到一起传给形参
def para(a,b,*args,name='eric',**kwargs):
print(a,b,args,name,kwargs)
para('info','you','are','beautiful',name='alex',sex='male')
结果:
4、知识点补充
可变类型和不可变类型:
可变类型:列表,字典
不可变类型:数字,字符串,元组,集合
访问顺序:
直接访问:数字
顺序访问:字符串,列表,元组
元素存放类型:
容器类型:列表,元组,字典
原子类型:数字,字符串
编码补充:
1、不同编码之间的二进制是不能相互识别的。
2、对于文件的存储以及传输,不能是unicode编码。
3、在python3中,bytes数据类型和str数据类型是及其相似的,str所有的方法在bytes都是适用的,但是区别就在于bytes是16进制的
bytes和str变现英文和中文的形式:
bytes: 非unicode编码类型,可以是utf-8,gbk,gb2312编码类型
s = 'china'
s1 = s.encode('utf-8')
print(s1)
str:只能是unicode编码类型
s = 'china'
s1 = s.encode('utf-8')
s2 = s1.decode('utf-8')
print(s2)
bytes:
s = '地雷'
s1 = s.encode('utf-8')
print(s1)
str:
s = '地雷'
s1 = s.encode('utf-8')
s2 = s1.decode('utf-8')
print(s2)
小数据池:小数据池存在的意义就是节省内存空间
str:
1、不能含有特殊字符
2、单个元素乘以的最大数字不能超过21
示例:
s = 'a'*20
s1 = 'a'*20
print(id(s),id(s1))
s = 'a'*20
s1 = 'a'*21
print(id(s),id(s1))
int:内存地址相同范围内的数为-5 -- 256
示例:
s = 100
s1 = 100
print(id(s),id(s1))
s = -6
s1 = -6
print(id(s),id(s1))
s = 257
s1 = 257
print(id(s),id(s1))
5、小程序测试
# 函数一:实现三次登陆功能
# 登录的用户名,密码必须从文件中取出。
# 实现三次登录。
# 函数二:实现新用户注册功能
# 用户写入用户名,密码。
# 检测:用户名不能重复。
# 函数三:购物功能
# 将购物车加工成函数。
# 加一个功能:
# 将买的商品写入到一个文件中,商品名,数量,单价。
# 整合三个函数,实现必须用户登录才能继续购物,如果没用户则必须注册
1、注册函数
def register():
import os
flag = False
while True:
reg_user = input('请输入需要注册的用户名:').strip()
print('**密码不能包含空格,长度为6-10个字符,必须包含字母,数字**')
reg_pwd = input('请输入注册账户的密码:').strip()
if len(reg_pwd) < 6 or len(reg_pwd) > 10:
print('**密码不符合规定**')
continue
info = {}
with open('login.txt',encoding='utf-8',mode='a') as f1, \
open('login.txt', mode='r',encoding='utf-8') as f2:
if os.path.getsize('loging'):
flag = False
for line in f2:
if reg_user == eval(line)['name']:
flag = True
if flag:
print('用户名存在,请重新输入')
continue
else:
info['name'] = reg_user
info['password'] = reg_pwd
f1.write(str(info) + '\n')
print('注册成功')
break
2、登录函数
def sign():
num = 3
flag = False
while num > 0:
sign_user = input('登录用户:').strip()
sign_pwd = input('登录密码:').strip()
with open('login.txt',encoding='utf-8',mode='r') as f1:
for item in f1:
if eval(item)['name'] == sign_user and eval(item)['password'] == sign_pwd :
flag = True
if flag:
ret =( '当前用户登录成功,欢迎%s'%(sign_user))
print(ret)
break
else:
num -= 1
print('尚未注册或密码错误,登录失败,剩余尝试次数%s' % (num))
continue
3、购物车函数
def shop_c():
goods = [{"name": "电脑", "price": 1999},
{"name": "鼠标", "price": 10},
{"name": "游艇", "price": 20},
{"name": "美女", "price": 998},
]
for i in range(len(goods)):
print(i, goods[i])
shop_l = []
money = int(input("请输入购物金额:").strip())
while True:
print(("如果退出请按'q'").center(30, "-"))
choice = input('请选择商品编号:').strip()
if choice == 'q':
s = ",".join(shop_l)
print ("您最终选择的商品有%s" %s)
break
else:
choice = int(choice)
if choice >= len(goods):
print('没有此选项,请重新输入')
continue
shop_l.append(goods[choice]['name'])
money -= goods[choice]['price']
print("您选择的产品有%s" % (shop_l), "共计%s样商品" % (len(shop_l)), "剩余金额为:%s元" % (money))
num = shop_l.count(goods[choice]['name'])
with open('shopping_cart.txt', encoding='utf-8', mode='a') as f1:
f1.write(str(goods[choice]) + '\n')
f1.write('%s为%s件,价格为%s'%(goods[choice]['name'],num,goods[choice]['price']*num) + '\n')
if money < goods[choice]['price']:
print("您的余额不足以购买%s" % (goods[choice]['name']), "剩余%s元" % (money), "请充值...")
recharge = int(input("充值金额为:").strip())
money += recharge
print("充值后当前金额为%s" % (money))
4、综合商城函数,三者整合
def shop_mall():
home_page = """****************商城首页*****************
1、用户登录,2、用户注册,3、商城购物
***********************************************
"""
flag = False
print(home_page)
while True:
chioce = input('请选择商城操作:').strip()
if chioce == 'q':
print('Go home')
break
elif chioce == '1':
print('用户登录'.center(30,'*'))
sign()
flag = True
elif chioce == '2':
print('用户注册'.center(30,'*'))
register()
elif chioce == '3':
if flag:
print('欢迎登录商城'.center(30,'*'))
shop_c()
else:
print('请先登录,再执行其他操作')
sign()
shop_c()
break
continue