一、Number

1.1 数字类型的创建

1 a = 10
2 b = a
3 b = 666
4
5 print(a)    # 10
6 print(b)    # 666

 1.2 Number 类型转换

1 num1 = 3.14
2 num2 = 5
3 num3 = int(num1)
4 num4 = float(num2)
5
6 print(num3)    # 3
7 print(num4)    # 5.0

py 内置数学函数:

# abs(x)    返回数字的绝对值,如abs(-10) 返回 10
# ceil(x)    返回数字的上入整数,如math.ceil(4.1) 返回 5
# cmp(x, y)    如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1
# exp(x)    返回e的x次幂(ex),如math.exp(1) 返回2.718281828459045
# fabs(x)    返回数字的绝对值,如math.fabs(-10) 返回10.0
# floor(x)    返回数字的下舍整数,如math.floor(4.9)返回 4
# log(x)    如math.log(math.e)返回1.0,math.log(100,10)返回2.0
# log10(x)    返回以10为基数的x的对数,如math.log10(100)返回 2.0
# max(x1, x2,...)    返回给定参数的最大值,参数可以为序列。
# min(x1, x2,...)    返回给定参数的最小值,参数可以为序列。
# modf(x)    返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示。
# pow(x, y)    x**y 运算后的值。
# round(x [,n])    返回浮点数x的四舍五入值,如给出n值,则代表舍入到小数点后的位数。
# sqrt(x)    返回数字x的平方根,数字可以为负数,返回类型为实数,如math.sqrt(4)返回 2+0j

二、字符串类型(string)

字符串是以单引号'或双引号"括起来的任意文本,比如'abc'"123"等等。

请注意,''""本身只是一种表示方式,不是字符串的一部分,因此,字符串'abc'只有abc这3个字符。如果'本身也是一个字符,那就可以用""括起来,比如"I'm OK"包含的字符是I'm,空格,OK这6个字符

2.1 创建字符串:

1 str = 'Hello world'

对应操作:

 1 # * 重复输出字符串
 2 print('Hello' * 2)    # HelloHello
 3
 4 # [],[:] 通过索引获取字符串中字符,这里和列表的切片操作是相同的,具体内容见列表
 5 print('Hello world'[2:])    # llo world
 6
 7 # in 成员运算符,返回布尔值
 8 print('el' in 'hello')    # True
 9 print('k' in 'hello')    # False
10
11 # % 格式化字符串
12 print('hello world')
13 print('%s world' % 'hello')
14
15 # + 字符串拼接
16 a = '你好,'
17 b = '世界'
18 c = a + b
19 print(c)    # 你好,世界
20
21 # + 效率低,推荐使用 join
22 c2 = ''.join([a, b])
23 print(c2)    # 你好,世界

python的内置方法:

# string.capitalize()                                  把字符串的第一个字符大写
# string.center(width)                                 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串
# string.count(str, beg=0, end=len(string))            返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数
# string.decode(encoding='UTF-8', errors='strict')     以 encoding 指定的编码格式解码 string,如果出错默认报一个 ValueError 的 异 常 , 除 非 errors 指 定 的 是 'ignore' 或 者'replace'
# string.encode(encoding='UTF-8', errors='strict')     以 encoding 指定的编码格式编码 string,如果出错默认报一个ValueError 的异常,除非 errors 指定的是'ignore'或者'replace'
# string.endswith(obj, beg=0, end=len(string))         检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False.
# string.expandtabs(tabsize=8)                         把字符串 string 中的 tab 符号转为空格,tab 符号默认的空格数是 8。
# string.find(str, beg=0, end=len(string))             检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1
# string.index(str, beg=0, end=len(string))            跟find()方法一样,只不过如果str不在 string中会报一个异常.
# string.isalnum()                                     如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False
# string.isalpha()                                     如果 string 至少有一个字符并且所有字符都是字母则返回 True,否则返回 False
# string.isdecimal()                                   如果 string 只包含十进制数字则返回 True 否则返回 False.
# string.isdigit()                                     如果 string 只包含数字则返回 True 否则返回 False.
# string.islower()                                     如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False
# string.isnumeric()                                   如果 string 中只包含数字字符,则返回 True,否则返回 False
# string.isspace()                                     如果 string 中只包含空格,则返回 True,否则返回 False.
# string.istitle()                                     如果 string 是标题化的(见 title())则返回 True,否则返回 False
# string.isupper()                                     如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False
# string.join(seq)                                     以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
# string.ljust(width)                                  返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串
# string.lower()                                       转换 string 中所有大写字符为小写.
# string.lstrip()                                      截掉 string 左边的空格
# string.maketrans(intab, outtab])                     maketrans() 方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。
# max(str)                                             返回字符串 str 中最大的字母。
# min(str)                                             返回字符串 str 中最小的字母。
# string.partition(str)                                有点像 find()和 split()的结合体,从 str 出现的第一个位置起,把 字 符 串 string 分 成 一 个 3 元 素 的 元 组 (string_pre_str,str,string_post_str),如果 string 中不包含str 则 string_pre_str == string.
# string.replace(str1, str2,  num=string.count(str1))  把 string 中的 str1 替换成 str2,如果 num 指定,则替换不超过 num 次.
# string.rfind(str, beg=0,end=len(string) )            类似于 find()函数,不过是从右边开始查找.
# string.rindex( str, beg=0,end=len(string))           类似于 index(),不过是从右边开始.
# string.rjust(width)                                  返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串
# string.rpartition(str)                               类似于 partition()函数,不过是从右边开始查找.
# string.rstrip()                                      删除 string 字符串末尾的空格.
# string.split(str="", num=string.count(str))          以 str 为分隔符切片 string,如果 num有指定值,则仅分隔 num 个子字符串
# string.splitlines(num=string.count('\n'))            按照行分隔,返回一个包含各行作为元素的列表,如果 num 指定则仅切片 num 个行.
# string.startswith(obj, beg=0,end=len(string))        检查字符串是否是以 obj 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查.
# string.strip([obj])                                  在 string 上执行 lstrip()和 rstrip()
# string.swapcase()                                    翻转 string 中的大小写
# string.title()                                       返回"标题化"的 string,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle())
# string.translate(str, del="")                        根据 str 给出的表(包含 256 个字符)转换 string 的字符,要过滤掉的字符放到 del 参数中
# string.upper()                                       转换 string 中的小写字母为大写

3、字节类型(bytes)

 1 a = bytes('中国', 'utf-8')
 2 b = bytes('hello', 'gbk')
 3
 4 print(a)     # b'\xe4\xb8\xad\xe5\x9b\xbd'
 5 print(b)     # b'hello'
 6
 7 print(ord('h'))     # 其十进制 unicode 值为: 104
 8 print(ord('中'))    # 其十进制 unicode 值为: 20013
 9
10 #  h   e   l   l   o
11 # 104 101 108 108 111   编码后结果:与ASCII表对应121314 #    中           国15 #   \xd6\xd0      \xb9\xfa         gbk编码后的字节结果16 # \xe4 \xb8 \xad     \xe5 \x9b \xbd    utf-8编码后的字节结果17 #  228 184 173      229 155  189      a[:] 切片取1819 c = a.decode('utf-8') # 中国20 d = b.decode('gbk')  # hello21 # b = a.decode('gbk') 很明显报错

注意:对于 ASCII 字符串,因为无论哪种编码对应的结果都是一样的,所以可以直接使用 b'xxxx' 赋值创建 bytes 实例,但对于非 ASCII 编码的字符则不能通过这种方式创建 bytes 实例,需要指明编码方式。

1 b1 = b'123'
2
3 print(type(b1))     # <class 'bytes'>
4
5 # b2 = b'中国' 报错
6 # 所有得这样:
7 b2 = bytes('中国', 'utf-8')
8
9 print(b2)     # b'\xe4\xb8\xad\xe5\x9b\xbd'

4、布尔值

一个布尔值只有TrueFalse两种值,要么是True,要么是False,在Python中,可以直接用TrueFalse表示布尔值(请注意大小写)

1 print(True)
2 print(4>2)
3 print(bool([3,4]))
4 print(True+1)

与或非操作:

bool(1 and 0)
bool(1 and 1)
bool(1 or 0)
bool(not 0)

布尔值经常用在条件判断中:

age = 18
if age > 18:  # bool(age>18)print('old')
else:print('young')

5、列表

什么是列表:

列表(list)是Python以及其他语言中最常用到的数据结构之一。Python使用使用中括号 [ ] 来解析列表。列表是可变的(mutable)——可以改变列表的内容。

对应操作:

1 查  ( [ ] )

 1 names_class2=['张三', '李四', '王五', '赵六']
 2
 3 print(names_class2[2])
 4 print(names_class2[0:3])
 5 print(names_class2[0:7])
 6 print(names_class2[-1])
 7 print(names_class2[2:3])
 8 print(names_class2[0:3:1])
 9 print(names_class2[3:0:-1])
10 print(names_class2[:])

2 增 (append, insert)

insert 方法用于将对象插入到列表中,而append方法则用于在列表末尾追加新的对象

1 names_class2.append('周七')
2 names_class2.insert(2, '陈八')
3 print(names_class2)

3 改 (重新赋值)

1 names_class2=['张三','李四','王五','赵六']
2
3 names_class2[3]='赵七'
4 names_class2[0:2]=['wusir','alvin']
5 print(names_class2)

4 删 (remove, del, pop)

names_class2.remove('赵六')
del names_class2[0]
del names_class2
names_class2.pop()    # 注意,pop是有一个返回值的 

5 其他操作

5.1 count

count 方法统计某个元素在列表中出现的次数:

1 >>> ['to', 'be', 'or', 'not', 'to', 'be'].count('to')
2 2
3 >>> x = [[1,2], 1, 1, [2, 1, [1, 2]]]
4 >>> x.count(1)
5 2
6 >>> x.count([1,2])
7 1

5.2 extend

extend 方法可以在列表的末尾一次性追加另一个序列中的多个值。

1 >>> a = [1, 2, 3]
2 >>> b = [4, 5, 6]
3 >>> a.extend(b)
4 >>> a
5 [1, 2, 3, 4, 5, 6] 

extend 方法修改了被扩展的列表,而原始的连接操作(+)则不然,它会返回一个全新的列表。

 1 >>> a = [1, 2, 3]
 2 >>> b = [4, 5, 6]
 3 >>> a.extend(b)
 4 >>> a
 5 [1, 2, 3, 4, 5, 6]
 6 >>>
 7 >>> a + b
 8 [1, 2, 3, 4, 5, 6, 4, 5, 6]
 9 >>> a
10 [1, 2, 3, 4, 5, 6] 

5.3 index

index 方法用于从列表中找出某个值第一个匹配项的索引位置:

1 names_class2.index('李四')

5.4 reverse

reverse 方法将列表中的元素反向存放。

1 names_class2.reverse()
2 print(names_class2)

5.5 sort

sort 方法用于在原位置对列表进行排序。

1 x = [4, 6, 2, 1, 7, 9]
2 x.sort()#x.sort(reverse=True)

5.6 深浅拷贝

对于一个列表,我想复制一份怎么办?

你当然可以重新赋值:

1 name_class = ['张三', '李四', '王五', '赵六']
2
3 name_class_copy = ['张三', '李四', '王五', '赵六']

这是两块独立的内存空间

这也没问题,但是,如果列表内容足够大,你能每个都重新都写一遍吗?这里,列表为我们提供了copy方法:

 1 name_class=['张三', '李四', '王五', '赵六', [1,2,3]]
 2
 3 name_class_copy = name_class.copy()
 4
 5 name_class[0] = 'zhangsan'
 6
 7 print(name_class)    # ['zhangsan', '李四', '王五', '赵六', [1, 2, 3]]
 8 print(name_class_copy)     # ['张三', '李四', '王五', '赵六', [1, 2, 3]]
 9
10 name_class[4][0] = 5
11
12 print(name_class)     # ['zhangsan', '李四', '王五', '赵六', [5, 2, 3]]
13 print(name_class_copy)     # ['zhangsan', '李四', '王五', '赵六', [5, 2, 3]]
14
15 # 问题来了,为什么name_class_copy,从这一点我们可以断定,这两个变量并不是完全独立的,那他们的关系是什么呢?为什么有的改变,有的不改变呢?

这里就涉及到深浅考核了:

 1 # 不可变数据类型:数字,字符串,元祖
 2 # 可变类型:列表,字典
 3
 4 list = [1, 2, 3]
 5
 6 print(id(list))     # 139692391564104
 7
 8 list[0] = 4
 9
10 print(id(list))     # 139692391564104
11
12 # 你对可变类型进行修改时,比如这个列表对象list,它的内存地址不会变化,注意是这个列表对象list, 不是它里面的元素
13
14 str = 'hello'
15
16 print(id(str))  # 像字符串,列表,数字这些不可变数据类型,,是不能修改的,比如我想要一个'hello的字符串,只能重新创建一个'hello'的对象,然后让指针只想这个新对象
17
18 # str[0] = 'e' 报错
19
20 # 重点: 浅拷贝
21 a=[[1,2],3,4]
22 b=a[:]#b=a.copy()
23
24 print(a,b)
25 print(id(a),id(b))
26 print('*************')
27 print('a[0]:',id(a[0]),'b[0]:',id(b[0]))
28 print('a[0][0]:',id(a[0][0]),'b[0][0]:',id(b[0][0]))
29 print('a[0][1]:',id(a[0][1]),'b[0][1]:',id(b[0][1]))
30 print('a[1]:',id(a[1]),'b[1]:',id(b[1]))
31 print('a[2]:',id(a[2]),'b[2]:',id(b[2]))
32
33
34 print('___________________________________________')
35 b[0][0]=8
36
37 print(a,b)
38 print(id(a),id(b))
39 print('*************')
40 print('a[0]:',id(a[0]),'b[0]:',id(b[0]))
41 print('a[0][0]:',id(a[0][0]),'b[0][0]:',id(b[0][0]))
42 print('a[0][1]:',id(a[0][1]),'b[0][1]:',id(b[0][1]))
43 print('a[1]:',id(a[1]),'b[1]:',id(b[1]))
44 print('a[2]:',id(a[2]),'b[2]:',id(b[2]))<br><br><br>#outcome
45
46 # [[1, 2], 3, 4] [[1, 2], 3, 4]
47 # 4331943624 4331943752
48 # *************
49 # a[0]: 4331611144 b[0]: 4331611144
50 # a[0][0]: 4297375104 b[0][0]: 4297375104
51 # a[0][1]: 4297375136 b[0][1]: 4297375136
52 # a[1]: 4297375168 b[1]: 4297375168
53 # a[2]: 4297375200 b[2]: 4297375200
54 # ___________________________________________
55 # [[8, 2], 3, 4] [[8, 2], 3, 4]
56 # 4331943624 4331943752
57 # *************
58 # a[0]: 4331611144 b[0]: 4331611144
59 # a[0][0]: 4297375328 b[0][0]: 4297375328
60 # a[0][1]: 4297375136 b[0][1]: 4297375136
61 # a[1]: 4297375168 b[1]: 4297375168
62 # a[2]: 4297375200 b[2]: 4297375200

6、元祖 tuple

元组被称为只读列表,即数据可以被查询,但不能被修改,所以,列表的切片操作同样适用于元组。

元组写在小括号(())里,元素之间用逗号隔开。

虽然tuple的元素不可改变,但它可以包含可变的对象,比如list列表。

构造包含 0 个或 1 个元素的元组比较特殊,所以有一些额外的语法规则:

1 tup1 = ()    # 空元组
2 tup2 = (20,) # 一个元素,需要在元素后添加逗号

作用:

1 对于一些数据我们不想被修改,可以使用元组;

2 另外,元组的意义还在于,元组可以在映射(和集合的成员)中当作键使用——而列表则不行;元组作为很多内建函数和方法的返回值存在。

6、字典 Dictionary

字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据。python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可哈希的。可哈希表示key必须是不可变类型,如:数字、字符串、元组。

字典(dictionary)是除列表意外python之中最灵活的内置数据结构类型。列表是有序的对象结合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。

创建字典:

dic1 = {'name': 'xibai', 'age': 18, 'sex': 'male'}dic2 = dict((('name', 'jl'),))print(dic1)print(dic2)

对应操作:

1 增

dic3 = {}dic3['name'] = 'orange'
dic3['age'] = 18print(dic3)     # {'name': 'orange', 'age': 18}

a = dic3.setdefault('name', 'chen')
b = dic3.setdefault('ages', 22)print(a, b) # orange 22print(dic3) # {'age': 18, 'ages': 22, 'name': 'orange'}

2 查

dic3 = {'name': 'asaki', 'age': 17}print(dic3['name'])     # asaki
# print(dic3['names'])    # KeyError: 'names'print(dic3.get('age'))  # 17print(dic3.get('names', False))  #  找不到不会报错,会返回默认值 None 指定就返回Falsprint(dic3.items())     # dict_items([('name', 'asaki'), ('age', 17)])print(dic3.values())    # dict_values(['asaki', 17])print(dic3.keys())      # dict_keys(['name', 'age'])print('name' in dic3)   # py2:dic3.has_key('name')print(list(dic3.values()))  # ['asaki', 17]

3 改

dic3 = {'name': 'asaki', 'age': 17}dic3['name'] = 'Kizuna'dic4 = {'sex': 'male', 'hobay': 'girl', 'age': 19}dic3.update(dic4)print(dic3)     # {'name': 'Kizuna', 'age': 19, 'sex': 'male', 'hobay': 'girl'}

4 删

dic4 = {'name': 'asaki', 'age': 17}# dic4.clear()# print(dic4) # {}del dic4['name']print(dic4) # {'age': 17}

a = dic4.popitem()
print(a, dic4)  # ('age', 17) {}

dic4['name'] = 'ai'print(dic4)print(dic4.pop('name')) # ai 返回被删除的值print(dic4)# del dic4 # print(dic4) # NameError: name 'dic4' is not defined

5 其他操作以及涉及到的方法

5.1 dict.fromkeys

d1 = dict.fromkeys(['host1', 'host2', 'host3'], 'mac')print(d1)   # {'host1': 'mac', 'host2': 'mac', 'host3': 'mac'}

d1['host1'] = 'xiaomi'print(d1)   # {'host1': 'xiaomi', 'host2': 'mac', 'host3': 'mac'}print(''.center(50, '*'))d2 = dict.fromkeys(['host1', 'host2', 'host3'], ['mac', 'huawei'])print(d2)   # {'host1': ['mac', 'huawei'], 'host2': ['mac', 'huawei'], 'host3': ['mac', 'huawei']}

d2['host1'][0] = 'xiaomi'print(d2)   # {'host1': ['xiaomi', 'huawei'], 'host2': ['xiaomi', 'huawei'], 'host3': ['xiaomi', 'huawei']}

5.2  d.copy() 对字典 d 进行浅复制,返回一个和d有相同键值对的新字典

5.3  字典的嵌套

av_catalog = {"欧美":{"www.youporn.com": ["很多免费的,世界最大的","质量一般"],"www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"],"letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"],"x-art.com":["质量很高,真的很高","全部收费,屌比请绕过"]},"日韩":{"tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"]},"大陆":{"1024":["全部免费,真好,好人一生平安","服务器在国外,慢"]}
}av_catalog["大陆"]["1024"][1] += ",可以用爬虫爬下来"
print(av_catalog["大陆"]["1024"])
#ouput
['全部免费,真好,好人一生平安', '服务器在国外,慢,可以用爬虫爬下来']

View Code

5.4 sorted(dict) : 返回一个有序的包含字典所有key的列表

dic = {5: '444', 3: '3', 6: '55'}print(sorted(dic))  # [3, 5, 6]

5.5 字典的遍历

dic = {'name': 'Kizuna', 'hoby': 'girl'}for i in dic:print(i, dic[i])# name Kizuna
# hoby girlfor items in dic.items():print(items)# ('name', 'Kizuna')
# ('hoby', 'girl')for keys, values in dic.items():print(keys, values)# name Kizuna
# hoby girl

8 集合(set)

集合是一个无序的,不重复的数据组合,它的主要作用如下:

  • 去重,把一个列表变成集合,就自动去重了
  • 关系测试,测试两组数据之前的交集、差集、并集等关系

集合(set):把不同的元素组成一起形成集合,是python基本的数据类型。

集合元素(set elements):组成集合的成员(不可重复)

li = [1, 2, 'a', 'b']s = set(li)print(s)    # {1, 2, 'b', 'a'}

li2 = [1, 2, 4, 'a', 'a', 'b']s = set(li2)print(s)    # {1, 'b', 2, 4, 'a'}

集合对象是一组无序排列的可哈希的值:集合成员可以做字典的键

li = [[1, 2], 'a', 'b']
s = set(li)     # TypeError: unhashable type: 'list'
print(s)

集合分类:可变集合、不可变集合

可变集合(set):可添加和删除元素,非可哈希的,不能用作字典的键,也不能做其他集合的元素

不可变集合(frozenset):与上面恰恰相反

li = [1, 2, 'a', 'b']s = set(li)print(s)dic = {s: '123'}    # 不能用作字典的键,也不能做其他集合的元素 TypeError: unhashable type: 'set'

集合的相关操作  

1、创建集合

由于集合没有自己的语法格式,只能通过集合的工厂方法set()和frozenset()创建

s1 = set('Kizuna')s2 = frozenset('Asaki')print(s1, type(s1))     # {'K', 'u', 'z', 'a', 'i', 'n'} <class 'set'>print(s2, type(s2))     # frozenset({'A', 'k', 'a', 'i', 's'}) <class 'frozenset'>

2、访问集合

由于集合本身是无序的,所以不能为集合创建索引或切片操作,只能循环遍历或使用in、not in来访问或判断集合元素。

s1 = set('Kizuna')print('a' in s1)    # Trueprint('c' in s1)    # False# s1[1]  # TypeError: 'set' object does not support indexingfor i in s1:print(i)# z
# u
# a
# K
# n
# i

3、更新集合

可使用以下内建方法来更新:

s.add()
s.update()
s.remove()

注意只有可变集合才能更新:

s1 = frozenset('Kizuna')# s1.add(0)   # AttributeError: 'frozenset' object has no attribute 'add'

s2 = set('Asaki')s2.add('mm')print(s2)   # {'mm', 'A', 's', 'a', 'k', 'i'}

s2.update('ho', '12') # 添加多个元素print(s2)   # {'s', 'mm', 'o', 'A', '1', '2', 'k', 'h', 'i', 'a'}

s2.remove('o')print(s2)   # {'s', 'k', '1', 'mm', 'A', 'a', 'i', '2', 'h'}

del:删除集合本身

四、集合类型操作符 

1   in ,not in
2   集合等价与不等价(==, !=)
3   子集、超集

s1 = set('KizunaAsa')s2 = set('Asa')print('v' in s1)    # Falseprint(s2 < s1)  # True

      4   联合(|)

   联合(union)操作与集合的or操作其实等价的,联合符号有个等价的方法,union()。

s1 = set('Kizuna')s2 = set('Asaki')s3 = s1 | s2print(s3)   # {'n', 'i', 'u', 'A', 'z', 'k', 'K', 'a', 's'}
print(s1.union(s2))     # {'n', 'i', 'u', 'A', 'z', 'k', 'K', 'a', 's'}

5、交集(&)

与集合and等价,交集符号的等价方法是intersection()

s1 = set('Kizuna')s2 = set('Asaki')s3 = s1 & s2print(s3)   # {'a', 'i'}
print(s1.intersection(s2))     # {'a', 'i'}

6、查集(-)
      等价方法是difference()

s1 = set('Kizuna')s2 = set('Asaki')s3 = s1 - s2print(s3)   # {'K', 'n', 'z', 'u'}
print(s1.difference(s2))     # {'K', 'n', 'z', 'u'}

7、对称差集(^)

对称差分是集合的XOR(‘异或’),取得的元素属于s1,s2但不同时属于s1和s2.其等价方法symmetric_difference()

s1 = set('Kizuna')s2 = set('Asaki')s3 = s1 ^ s2print(s3)   # {'n', 'z', 'K', 'k', 'A', 'u', 's'}
print(s1.symmetric_difference(s2))     # {'n', 'z', 'K', 'k', 'A', 'u', 's'}

应用

'''最简单的去重方式'''lis = [1, 2, 2, 3, 4, 1, 2, 5]print(list(set(lis)))   # [1, 2, 3, 4, 5]

9 文件操作

9.1 对文件操作流程

  1. 打开文件,得到文件句柄并赋值给一个变量
  2. 通过句柄对文件进行操作
  3. 关闭文件

现有文件如下:

昨夜寒蛩不住鸣。
惊回千里梦,已三更。
起来独自绕阶行。
人悄悄,帘外月胧明。
白首为功名,旧山松竹老,阻归程。
欲将心事付瑶琴。
知音少,弦断有谁听。

f = open('小重山', encoding = 'utf-8')data = f.read()print(data)f.close()

注意 if in the win,hello文件是utf8保存的,打开文件时open函数是通过操作系统打开的文件,而win操作系统

默认的是gbk编码,所以直接打开会乱码,需要f=open('hello',encoding='utf8'),hello文件如果是gbk保存的,则直接打开即可。

9.2 文件打开模式  

========= ===============================================================Character Meaning--------- ---------------------------------------------------------------'r'       open for reading (default)'w'       open for writing, truncating the file first'x'       create a new file and open it for writing'a'       open for writing, appending to the end of the file if it exists'b'       binary mode't'       text mode (default)'+'       open a disk file for updating (reading and writing)'U'       universal newline mode (deprecated)
========= ===============================================================

先介绍三种最基本的模式:

# f = open('小重山2','w') #打开文件
# f = open('小重山2','a') #打开文件
# f.write('莫等闲1\n')
# f.write('白了少年头2\n')
# f.write('空悲切!3')

9.3 文件具体操作

def read(self, size=-1): # known case of _io.FileIO.read"""注意,不一定能全读回来Read at most size bytes, returned as bytes.Only makes one system call, so less data may be returned than requested.In non-blocking mode, returns None if no data is available.Return an empty bytes object at EOF."""return ""def readline(self, *args, **kwargs):passdef readlines(self, *args, **kwargs):passdef tell(self, *args, **kwargs): # real signature unknown"""Current file position.Can raise OSError for non seekable files."""passdef seek(self, *args, **kwargs): # real signature unknown"""Move to new file position and return the file position.Argument offset is a byte count.  Optional argument whence defaults toSEEK_SET or 0 (offset from start of file, offset should be >= 0); other valuesare SEEK_CUR or 1 (move relative to current position, positive or negative),and SEEK_END or 2 (move relative to end of file, usually negative, althoughmany platforms allow seeking beyond the end of a file).Note that not all file objects are seekable."""passdef write(self, *args, **kwargs): # real signature unknown"""Write bytes b to file, return number written.Only makes one system call, so not all of the data may be written.The number of bytes actually written is returned.  In non-blocking mode,returns None if the write would block."""passdef flush(self, *args, **kwargs):passdef truncate(self, *args, **kwargs): # real signature unknown"""Truncate the file to at most size bytes and return the truncated size.Size defaults to the current file position, as returned by tell().The current file position is changed to the value of size."""passdef close(self): # real signature unknown; restored from __doc__"""Close the file.A closed file cannot be used for further I/O operations.  close() may becalled more than once without error."""pass
##############################################################less usefulldef fileno(self, *args, **kwargs): # real signature unknown""" Return the underlying file descriptor (an integer). """passdef isatty(self, *args, **kwargs): # real signature unknown""" True if the file is connected to a TTY device. """passdef readable(self, *args, **kwargs): # real signature unknown""" True if file was opened in a read mode. """passdef readall(self, *args, **kwargs): # real signature unknown"""Read all data from the file, returned as bytes.In non-blocking mode, returns as much as is immediately available,or None if no data is available.  Return an empty bytes object at EOF."""passdef seekable(self, *args, **kwargs): # real signature unknown""" True if file supports random-access. """passdef writable(self, *args, **kwargs): # real signature unknown""" True if file was opened in a write mode. """pass操作方法介绍

View Code

f = open('小重山') #打开文件
# data1=f.read()#获取文件内容
# data2=f.read()#获取文件内容
#
# print(data1)
# print('...',data2)
# data=f.read(5)#获取文件内容# data=f.readline()
# data=f.readline()
# print(f.__iter__().__next__())
# for i in range(5):
#     print(f.readline())# data=f.readlines()# for line in f.readlines():
#     print(line)# 问题来了:打印所有行,另外第3行后面加上:'end 3'
# for index,line in enumerate(f.readlines()):
#     if index==2:
#         line=''.join([line.strip(),'end 3'])
#     print(line.strip())#切记:以后我们一定都用下面这种
# count=0
# for line in f:
#     if count==3:
#         line=''.join([line.strip(),'end 3'])
#     print(line.strip())
#     count+=1# print(f.tell())
# print(f.readline())
# print(f.tell())#tell对于英文字符就是占一个,中文字符占三个,区分与read()的不同.
# print(f.read(5))#一个中文占三个字符
# print(f.tell())
# f.seek(0)
# print(f.read(6))#read后不管是中文字符还是英文字符,都统一算一个单位,read(6),此刻就读了6个中文字符#terminal上操作:
f = open('小重山2','w')
# f.write('hello \n')
# f.flush()
# f.write('world')# 应用:进度条
# import time,sys
# for i in range(30):
#     sys.stdout.write("*")
#     # sys.stdout.flush()
#     time.sleep(0.1)# f = open('小重山2','w')
# f.truncate()#全部截断
# f.truncate(5)#全部截断# print(f.isatty())
# print(f.seekable())
# print(f.readable())

f.close() #关闭文件

接下来我们继续扩展文件模式:

# f = open('小重山2','w') #打开文件
# f = open('小重山2','a') #打开文件
# f.write('莫等闲1\n')
# f.write('白了少年头2\n')
# f.write('空悲切!3')# f.close()#r+,w+模式
# f = open('小重山2','r+') #以读写模式打开文件
# print(f.read(5))#可读
# f.write('hello')
# print('------')
# print(f.read())# f = open('小重山2','w+') #以写读模式打开文件
# print(f.read(5))#什么都没有,因为先格式化了文本
# f.write('hello alex')
# print(f.read())#还是read不到
# f.seek(0)
# print(f.read())#w+与a+的区别在于是否在开始覆盖整个文件# ok,重点来了,我要给文本第三行后面加一行内容:'hello 岳飞!'
# 有同学说,前面不是做过修改了吗? 大哥,刚才是修改内容后print,现在是对文件进行修改!!!
# f = open('小重山2','r+') #以写读模式打开文件
# f.readline()
# f.readline()
# f.readline()
# print(f.tell())
# f.write('hello 岳飞')
# f.close()
# 和想的不一样,不管事!那涉及到文件修改怎么办呢?# f_read = open('小重山','r') #以写读模式打开文件
# f_write = open('小重山_back','w') #以写读模式打开文件# count=0
# for line in f_read:# if count==3:#     f_write.write('hello,岳飞\n')#
    # else:#     f_write.write(line)# another way:# if count==3:#
    #     line='hello,岳飞2\n'# f_write.write(line)# count+=1# #二进制模式
# f = open('小重山2','wb') #以二进制的形式读文件
# # f = open('小重山2','wb') #以二进制的形式写文件
# f.write('hello alvin!'.encode())#b'hello alvin!'就是一个二进制格式的数据,只是为了观看,没有显示成010101的形式

注意1:  无论是py2还是py3,在r+模式下都可以等量字节替换,但没有任何意义的! 

注意2:有同学在这里会用readlines得到内容列表,再通过索引对相应内容进行修改,最后将列表重新写会该文件。

这种思路有一个很大的问题,数据若很大,你的内存会受不了的,而我们的方式则可以通过迭代器来优化这个过程。 

补充:rb模式以及seek

在py2中:

#昨夜寒蛩不住鸣.

f = open('test','r',) #以写读模式打开文件

f.read(3)# f.seek(3)
# print f.read(3) # 夜# f.seek(3,1)
# print f.read(3) # 寒# f.seek(-4,2)
# print f.read(3) # 鸣

在py3中:

# test:
昨夜寒蛩不住鸣.f = open('test','rb',) #以写读模式打开文件

f.read(3)# f.seek(3)
# print(f.read(3)) # b'\xe5\xa4\x9c'# f.seek(3,1)
# print(f.read(3)) # b'\xe5\xaf\x92'# f.seek(-4,2)
# print(f.read(3))   # b'\xe9\xb8\xa3'#总结: 在py3中,如果你想要字符数据,即用于观看的,则用r模式,这样我f.read到的数据是一个经过decode的
#     unicode数据; 但是如果这个数据我并不需要看,而只是用于传输,比如文件上传,那么我并不需要decode
#     直接传送bytes就好了,所以这个时候用rb模式.#     在py3中,有一条严格的线区分着bytes和unicode,比如seek的用法,在py2和py3里都是一个个字节的seek,
#     但在py3里你就必须声明好了f的类型是rb,不允许再模糊.#建议: 以后再读写文件的时候直接用rb模式,需要decode的时候仔显示地去解码.

9.4 with语句

为了避免打开文件后忘记关闭,可以通过管理上下文,即:

with open('log','r') as f:pass

如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。

在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:

with open('log1') as obj1, open('log2') as obj2:pass

转载于:https://www.cnblogs.com/Asaki/p/9870212.html

【第2篇】基础数据类型相关推荐

  1. python 【第一篇】基础数据类型

    基础数据类型 python基础数据类型:int,bool,str,list,tuple,dict,set. 1.数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2** ...

  2. 表达式类型的实现数据结构_Redis系列(九)底层数据结构之五种基础数据类型的实现...

    前言 定义 字符串对象 int raw embstr 浮点数如何保存? 编码转换条件 总结 列表对象 总结 集合对象 intset hashtable 总结 有序集合对象 ziplist 编码 ski ...

  3. 重温《数据库系统概论》【第一篇 基础篇】【第3章 关系数据库标准语言SQL】

    本篇内容为中国人民大学教授王珊.萨师煊的<数据库系统概论>自学课程的复习笔记,学习视频源于小破站(传送门),对应视频P16-P27,属教材"[第一篇 基础篇]"的&qu ...

  4. 重温《数据库系统概论》【第一篇 基础篇】【第2章 关系数据库】

    本篇内容为中国人民大学教授王珊.萨师煊的<数据库系统概论>自学课程的复习笔记,学习视频源于小破站(传送门),对应视频P9-P15,属教材"[第一篇 基础篇]"的&quo ...

  5. java基础数据类型包装类

    基础数据类型包装类 当一个程序要求交互式输入一个int类型的年龄时,从文本框中输入的结果肯定是String类型的.要在程序中进行相关操作,它必须先转换为int类型.因此可以使用数据类型的转换或强制转换 ...

  6. mysql8.0日期类型_mysql8.0.19基础数据类型详解

    mysql基础数据类型 mysql常用数据类型概览 ![1036857-20170801181433755-146301178](D:\笔记\mysql\复习\1036857-201708011814 ...

  7. Go 专栏|基础数据类型:整数、浮点数、复数、布尔值和字符串

    Go 专栏的第三篇,本文内容依旧很基础,很简单.如果有编程经验的话,可能扫一眼就了然于胸了.但如果刚开始接触编程,建议还是好好看看,把文中的代码 demo 都自己跑一遍.只有基础打好了,才能向更高的目 ...

  8. MySQL数据库,从入门到精通:第十二篇——MySQL数据类型详解

    MySQL数据库,从入门到精通:第十二篇--MySQL数据类型详解 第 12 章_MySQL数据类型精讲 1. MySQL中的数据类型 2. 整数类型 2. 1 类型介绍 2. 2 可选属性 2. 2 ...

  9. 初识mysql数据字段属性_MySQL数据库~~~~初识、基础数据类型

    一 数据库初识 1.1 什么是数据库 数据库(DataBase,简称DB),简而言之可视为电子化的文件柜----存储电子文件的处所,用户可以对文件中的数据运行新增,截取,更新,删除等操作. 所谓数据库 ...

  10. Webpack系列-第一篇基础杂记

    系列文章 Webpack系列-第一篇基础杂记 Webpack系列-第二篇插件机制杂记 Webpack系列-第三篇流程杂记 前言 公司的前端项目基本都是用Webpack来做工程化的,而Webpack虽然 ...

最新文章

  1. xml语法规则(一)
  2. python3-Python3 数字(Number)
  3. linux思考の为何要挂载
  4. informix clob转oracle 乱码_Oracle 视图-序列-权限-表-事务
  5. Django从理论到实战(part10)--URL命名与反转
  6. ubuntu11.10安装arm-linux-gcc详解
  7. matlab里符号的写法,Matlab中特殊符号的写法
  8. Tomcat启用HTTPS协议配置过程
  9. java数组有跨类建立对象_必会的 55 个 Java 性能优化细节!一网打尽!
  10. OpenCV中cornerSubPixel()亚像素求精原理
  11. 线性反馈移位寄存器实现产生伪随机数M序列
  12. android 动态表情实现,Android编程实现QQ表情的发送和接收完整实例(附源码)
  13. 电子电路设计小目录------面包板制作130例
  14. 扎实干货!PP-Tracking:百度提出实时目标跟踪系统(附源码教程)
  15. aliyun阿里云发送短信验证码和校验
  16. linux统计代码耗时函数,统计函数执行耗时
  17. .net服务端渲染_驳:服务端命令 VS 表间公式
  18. 前后台端分离 跨域SESSION 失效问题
  19. pvpgn mysql d2gs_pvpgn战网命令集
  20. nginx反向代理,隐藏服务IP

热门文章

  1. 视频编码解码(x264参数)
  2. c语言笔记——黑马程序员上课笔记
  3. 地铁三号线 - 95后的财务自由
  4. 徐辉 北大计算机,徐辉的痛苦回忆_徐辉经历的那一段痛苦回忆
  5. 计算机屏幕纵向显示如何改,电脑桌面纵向怎么设置
  6. matlab 祁彬彬,MATLAB 向量化编程基础精讲
  7. Gerrit 2.11.5 发布,代码评审工具
  8. 中触媒科创板上市:市值74亿 为李进与刘颐静夫妻店
  9. Bitvise SSH Client下载
  10. SAP UI5 Cross Application Navigation (跨应用间跳转)的本地模拟实现试读版