Day03 集合,函数,字符串格式化输出,三目运算,lambda表达式,文件操作
第一节,集合
除了之前学过的数据类型,int,str,bool,list,dict,tuple,还有一个基本数据类型-集合,集合是一组无序,不重复的序列。由于这个特性,所以集合的元素也可以作为字典的键。
1.集合的创建
cast = set() #创建空集合
>>> cast = set ('name')
>>> cast
{'a', 'm', 'n', 'e'}
>>> cast = set (['name','age'])
>>> cast
{'age', 'name'}
>>> cast = set (('name','age'))
>>> cast
{'age', 'name'}
>>> cast = set ({'name':'alex','age':18})
>>> cast
{'age', 'name'}
2.集合的操作
a.add() #一次只能添加一个元素
>>> cast = set(['name'])
>>> cast
{'name'}
>>> cast.add('age')
>>> cast
{'age', 'name'}
a.update() #一次能添加多个元素
>>> cast = set(['name','age'])
>>> cast.update(['sex','work'])
>>> cast
{'age', 'name', 'sex', 'work'}
a.clear() #清空集合a
>>> cast
{'age', 'name', 'sex', 'work'}
>>> cast.clear()
>>> cast
set()
a.copy() #拷贝集合a
>>> cast
{'age', 'name'}
>>> info = cast.copy()
>>> info
{'age', 'name'}
a.difference(b) #比较两个集合,生成一个新的a存在b不存在的集合
>>> cast = set([11,22,33])
>>> cast
{33, 11, 22}
>>> info = set([22,33,44])
>>> info
{33, 44, 22}
>>> print(cast.difference(info))
{11}
>>> print(info.difference(cast))
{44}
a.difference_update(b) #将difference()生成的结果赋值回a
>>> cast
{33, 11, 22}
>>> info
{33, 44, 22}
>>> cast.difference_update(info)
>>> cast
{11}
a.discard(b) #移除指定元素b,如果b不存在,不报错
>>> cast = set([11,22,33])
>>> cast.discard(33)
>>> cast
{11, 22}
a.intersection(b) #取ab交集
>>> cast
{33, 11, 22}
>>> info
{33, 44, 22}
>>> cast.intersection(info)
{33, 22}
a.intersection_update(b) #取ab交集并将结果更新回a
>>> cast
{33, 11, 22}
>>> info
{33, 44, 22}
>>> cast.intersection(info)
{33, 22}
>>> cast.intersection_update(info)
>>> cast
{33, 22}
a.isdisjoint(b) #ab没有交集,返回True,否则返回False
>>> cast = set([11,22,33])
>>> info = set([22,33,44])
>>> cast.isdisjoint(info)
False
>>> cast = set([11,22,33])
>>> info = set([44,55,66])
>>> cast.isdisjoint(info)
True
a.issubset(b) #a是否是b的子集
>>> cast = set([11,22,33])
>>> info = set([22,33])
>>> cast.issubset(info)
False
>>> info.issubset(cast)
True
a.issuperset(b) #a是否是b的父集
>>> cast = set([11,22,33])
>>> info = set([22,33])
>>> cast.issuperset(info)
True
>>> info.issuperset(cast)
False
a.pop() #随机移除一个元素
>>> cast = set([11,22,33])
>>> cast.pop()
33
>>> cast.pop()
11
a.remove(b) #移除指定元素b,如果不存在,报错
>>> cast = set([11,22,33,])
>>> cast.remove(33)
>>> cast
{11, 22}
>>> cast.remove(44)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 44
a.symmetric_difference(b) #对称差集
>>> cast = set([11,22,33])
>>> info = set([22,33,44])
>>> a = cast.intersection(info)
>>> b = cast.union(info)
>>> a
{33, 22}
>>> b
{33, 22, 11, 44}
>>> cast.symmetric_difference(info)
{11, 44}
a.symmetric_difference_update(b) #将a.symmetric_difference(b)的结果更新回a
>>> cast.symmetric_difference(info)
{11, 44}
>>> cast
{33, 11, 22}
>>> cast.symmetric_difference_update(info)
>>> cast
{11, 44}
a.union(b) #取ab并集
>>> cast = set([11,22,33])
>>> info = set([22,33,44])
>>> cast.union(info)
{33, 22, 11, 44}
第二节 函数
函数是组织好,可重复利用的的代码段。它能提高应用的模块性,代码的重复利用率,用户可以自定义函数来实现某些功能,这被叫做用户自定义函数。
定义函数:
函数代码块以def关键词开头,后接函数标识符名称和小括号()
任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
函数的第一行语句可以使用””” 选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号起始,并且缩进。
return [表达式] 结束函数,选择性地返回一个值给调用方。一旦return,函数就不再往下执行,不带表达式的return相当于返回 None。
函数参数:
1.普通参数(严格按照顺序,将实际参数赋值给形式参数)
如下:(顺便掌握字符串格式化输出)
def print_out(name_info,age_info):
print('name: {0} | age: {1}'.format(name_info,age_info))
print('result'.center(25,'-'))
print_out('alex','18')
----------result---------
name: alex | age: 18
2.默认参数(必须放置在参数列表的最后)
如下:(顺便掌握字符串格式化输出)
def print_out(name_info,age_info=18):
print('name: {name} | age: {name}'.format(name=name_info, age=age_info))
print_out('alex')
----------result---------
name: alex | age: alex
3.指定参数(将实际参数赋值给指定的形式参数)
def print_out(name_info,age_info):
print('name: {name} | age: {age}'.format(age=age_info,name=name_info))
print('result'.center(25,'-'))
print_out(age_info=18,name_info='alex')
----------result---------
name: alex | age: 18
4.动态参数:
* 默认将传入的参数,全部放置在元组中
** 默认将传入的参数,全部放置在字典中
def print_out(*args):
print('name: {0} | age: {1}'.format(args[0], args[1]))
print('result'.center(25,'-'))
print_out(*['alex',18,])
----------result---------
name: alex | age: 18
def print_out(**kwargs):
print('name: {name} | age: {age}'.format(age=kwargs['age'], name=kwargs['name']))
print('result'.center(25,'-'))
print_out(**{'name':'alex','age':18,})
----------result---------
name: alex | age: 18
5.万能参数 *args,**kwargs
def print_out(*args,**kwargs):
print('name: {name} | age: {age}'.format(age=kwargs['age'], name=args[0]))
print('result'.center(25,'-'))
print_out(*['alex'],**{'age':18,})
----------result---------
name: alex | age: 18
第三节 三目运算 lambda表达式
三目运算
lambda表达式
第四节 文件操作
操作文件前线简单了解下字符编码以中文为例,utf-8:一个汉字,三个字节 gbk: 一个汉字,两个字节一个字节有8位二进制,因此一个汉字在utf-8编码下有24位,在gbk编码下有16位,因此读写的编码必须一样,否则会出现乱码情况。
字符串转换字节类型bytes()
字节转换成字符串str()
1.打开文件操作模式有r,w,a,x,b,r+,w+,a+,从文件顶部读取内容 从文件底部添加内容 不存在则创建带了b,就是字节模式操作,不带b,就是字符模式操作。r 只读w 只写(会清空文件)a 追加x 文件若存在,报错,不存在,创建并只写r+,w+,a+,rb+,rw+,ab+ 都是读写模式r+ 不会创建不存在的文件,从顶部开始写,会覆盖之前此位置的内容w+ 文件存在,则覆盖整个文件,不存在则创建a+ 从文件顶部读取内容 从文件底部添加内容 不存在则创建常用的一些方法open() 打开文件tell() 获取当前指针的位置(字节)seek() 指针跳转到指定位置(字节)write() 写数据close() 关闭文件flush() 强刷文件readline() 一次仅读一行truncate() 截断,指针为后的清空
下面来看几个实际应用例子:eg1:f = open('user.info','r+')
print(f.read())
print(f.tell())
f.seek(6)
print(f.read())
print(f.tell())
f.close()
----------result---------
admin 123
jiang abc
he xyz
chen 000
40
123
jiang abc
he xyz
chen 000
40
eg2:
admin
f = open("db", 'a',encoding="utf-8")
f.write("xyz")
input('abc')执行后查看文件db,文件内容仍然只有admin改写f = open("db", 'a',encoding="utf-8")
f.write("xyz")
f.flush()
input('abc')执行后查看,文件内容已经添加上xyz这是因为一般的文件流操作都包含缓冲机制,write方法并不直接将数据写入文件,而是先写入内存中特定的缓冲区。flush方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区。正常情况下缓冲区满时,操作系统会自动将缓冲数据写入到文件中。至于close方法,原理是内部先调用flush方法来刷新缓冲区,再执行关闭操作,这样即使缓冲区数据未满也能保证数据的完整性。如果进程意外退出或正常退出时而未执行文件的close方法,缓冲区中的内容将会丢失。
最后补充,open()文件操作后,都需要close()方法来关闭打开过的文件,另一种with open()的方式则可以在文件操作完毕后自动关闭文件.