Python基础

写在前面



    大人不华,君子务实。



一、进制相关

- 进制基础

  数据存储在磁盘上或者内存中,都是以0、1形式存在的;即是以 二进制 的形式存在;

  为了存储和展示,人们陆续扩展了数据的表示形式:八进制 -> 十进制 -> 十六进制...

 二进制:0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 10000 10001  ...
八进制:
0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 ... 十进制:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ... 十六进制:0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 ...

 - 文件读写相关函数方法

  虽然硬盘上存储形式都是简单的0和1,但是随着计算机科学的快速普及和发展,兼容了越来越多的语言和文字;所以出现了很多编码形式;

  然而每一种编码都有自己的对应关系且每个byte由8个bit组成:ASCII码规定每个字符由8个bit表示,不能表示汉字;utf-8规定每个汉字由24个bit表示;

  更多参见:Python基础-day01

  所以针对存储在硬盘上的数据,要想正确的识别并展示出来,就必须要知道其存储的编码格式,否则则会出现乱码;

#1 Python中文件读写的小例子:

1 #!/usr/bin/python
 2 # -*- coding:utf-8 -*-
 3 
 4 f1 = open('log','r',encoding='utf-8')
 5 f2 = open('log','rb')
 6 data1 = f1.read()
 7 data2= f2.read()
 8 print(data1)
 9 print(data2)
10 
11 result:
12 D:softworkpython35python.exe D:/soft/work/Python_17/day02/s01.py
13 adada英文——_.
14 b'adadaxe8x8bxb1xe6x96x87xe2x80x94xe2x80x94_.'
15 
16 Process finished with exit code 0


log文件内容:
adada英文——_.

二、类和对象初探

- 类/class

类,具有某些属性和行为的抽象结构

代码中,属性对应了一些变量,行为则对应了一些具体的方法;

- 对象/object

对象,是类的实例,即具有某些属性和行为的实物

- 面向对象

  - 封装

  - 继承

  - 多态

    - 重载

  ...

> 例如:水果是一个类/class,香蕉则是一个对象/object;

- Python 中的类和对象

比如我们常用的字符串类型:

1 class str(object):{...}
2 ---
3 #!/usr/bin/python
4 # -*- coding:utf-8 -*-
5 
6 string = "Hello"
7 new_str = string.upper()
8 print(new_str)

 string 变量通过 '=' 赋值,成为了一个str类的对象实例,存储在内存中;因为str类具有 'upper()' 方法,所以string对象继承了该方法,可以执行相关操作;

三、基本数据类型常用方法介绍

- 字符串/str

  - 类型:  不可变(immutable)

  下面这个小例子,试图修改字符串,解释器报错;

 1 #!/usr/bin/python
 2 # -*- coding:utf-8 -*-
 3 
 4 string = "Hello"
 5 print(string)
 6 print(string[2])
 7 string[2] = '+'
 8 print(string)
 9 print(string[2])
10 
11 ---
12 D:softworkpython35python.exe D:/soft/work/Python_17/day02/s03.py
13 Hello
14 l
15 Traceback (most recent call last):
16   File "D:/soft/work/Python_17/day02/s03.py", line 9, in <module>
17     string[2] = '+'
18 TypeError: 'str' object does not support item assignment
19 
20 Process finished with exit code 1

   - 基础功能

    - 1.capitalize | 首字母大写

1 name = 'alex'
2 v = name.capitalize()
3 print(name)
4 print(v)
5 
6 ---
7 alex
8 Alex

     - 2.casefold 和 lower | 所有大写变小写,casefold 功能强于 lower

 1 name = 'HeLLo!'
 2 v = name.casefold()
 3 v2 = name.lower()
 4 print(name)
 5 print(v)
 6 print(v2)
 7 
 8 ---
 9 HeLLo!
10 hello!
11 hello!
 1 # ß 是德语里的一个大写字符
 2 
 3 name = 'ß'
 4 v = name.casefold()
 5 v2 = name.lower()
 6 print(v)
 7 print(v2)
 8 
 9 ---
10 ss
11 ß

    - 3.center, ljust, rjust | 文本居中,居左,居右,并填充显示,arg1 -> 表示总长度;arg2 -> 表示填充字符;

 1 name = 'standby'
 2 v = name.center(10,'#')
 3 v2 = name.ljust(10,'@')
 4 v3 = name.rjust(10,'+')
 5 print(v)
 6 print(v2)
 7 print(v3)
 8 
 9 ---
10 #standby##
11 standby@@@
12 +++standby

     - 4.count | 子序列在字符串中出现的次数;arg1 -> 子序列; arg2 -> 匹配查找的起始位置; arg3 -> 匹配查找的结束位置;

 1 desc = "This is www.iqiyi.com."
 2 v = desc.count('i')
 3 v2 = desc.count('is')
 4 v3 = desc.count('is',1,5)
 5 print(v)
 6 print(v2)
 7 print(v3)
 8 
 9 ---
10 5
11 2
12 1

     - 5.encode | 把字符串转换成 bytes 类型表示; arg1 -> 指定编码;

1 name = '中国'
2 new_name1 = name.encode('utf-8')
3 new_name2 = name.encode('gbk')
4 print(new_name1, type(new_name1), len(new_name1))
5 print(new_name2, type(new_name2), len(new_name2))
6 
7 ---
8 b'xe4xb8xadxe5x9bxbd' <class 'bytes'> 6
9 b'xd6xd0xb9xfa' <class 'bytes'> 4

     - 6.endswith 和 startswith | 是否以xxx结尾、开头; arg1 -> xxx;arg2 -> 匹配查找的起始位置; arg3 -> 匹配查找的结束位置;

1 hitwh = "Just stick to what you love and believe in."
2 v = hitwh.startswith('Just')
3 v2 = hitwh.startswith('s',5,11)
4 v3 = hitwh.endswith('t',5,12)
5 print(v,v2,v3)
6 
7 ---
8 True True True

     - 7.expandtabs | 找到制表符 ,进行替换;arg1 -> 指定替换后的长度(包含 ' ' 前面的子序列);

 1 my = 'haha	Python_17	www.baidu.com
www.standby.pub	xxxx	like'
 2 print(my)
 3 v = my.expandtabs(20)
 4 print(v)
 5 
 6 ---
 7 haha    Python_17    www.baidu.com
 8 www.standby.pub    xxxx    like
 9 haha                Python_17           www.baidu.com
10 www.standby.pub     xxxx                like

     - 8.find 和 index | 查找子序列索引位置,不存在则返回 '-1';index查找,不存在的话就报错了;默认是从左向右查找,另外还有 rfind 和 rindex,即从右向左查找;

name = 'alex'
v = name.find('e')
v2 = name.find('o')
print(v)
print(v2)

---
2
-1
1 name = 'alex'
2 v = name.index('o')
3 print(v)
4 
5 ---
6 Traceback (most recent call last):
7   File "D:/soft/work/Python_17/day02/s02.py", line 35, in <module>
8     v = name.index('o')
9 ValueError: substring not found

    - 9.format 和 format_map | 格式化输出的几种形式

 1 # Format output 1
 2 my = "I am %s, age is %s, gender is %s."
 3 print(my % ('standby',22,'male'))
 4 # Format output 2
 5 my = "I am {0}, age is {1}, gender is {2}."
 6 print(my.format('standby',23,'male'))
 7 # Format output 3
 8 my = "I am {name}, age is {age}, gender is {gender}."
 9 print(my.format(name = 'standby',age = 24,gender = 'male'))
10 # Format output 4
11 my = "I am {name}, age is {age}, gender is {gender}."
12 print(my.format_map({'name':'standby','age':25,'gender':'male'}))
13 
14 ---
15 I am standby, age is 22, gender is male.
16 I am standby, age is 23, gender is male.
17 I am standby, age is 24, gender is male.
18 I am standby, age is 25, gender is male.

     - 10.isdecimal, isdigit, isnumeric | 判断是否是数字;isdecimal < isdigit < isnumeric

 1 num = '123'
 2 num2 = '九十八'
 3 num3 = ''
 4 v1 = num.isdecimal()
 5 v2 = num.isdigit()
 6 v3 = num.isnumeric()
 7 print(v1,v2,v3)
 8 v1 = num2.isdecimal()
 9 v2 = num2.isdigit()
10 v3 = num2.isnumeric()
11 print(v1,v2,v3)
12 v1 = num3.isdecimal()
13 v2 = num3.isdigit()
14 v3 = num3.isnumeric()
15 print(v1,v2,v3)
16 
17 ---
18 True True True
19 False False True
20 False True True

     - 11.isalpha | 判断字符串是否只有字母组成

 1 string = 'str'
 2 name = 'alex123'
 3 v = name.isalpha()
 4 v2 = string.isalpha()
 5 print(v)
 6 print(v2)
 7 
 8 ---
 9 False
10 True

     - 12.isalnum | 判断字符串是否由字母和数字组成

 1 name = 'alex123'
 2 string = 'str赢.'
 3 v = name.isalnum()
 4 v2 = string.isalnum()
 5 print(v)
 6 print(v2)
 7 
 8 ---
 9 True
10 False

    - 13.isidentifier | 判断是否可以用作标识符、变量名

 1 string1 = '1a'
 2 string2 = 'int'
 3 string3 = 'name'
 4 v = string1.isidentifier()
 5 v2 = string2.isidentifier()
 6 v3 = string3.isidentifier()
 7 print(v)
 8 print(v2)
 9 print(v3)
10 
11 ---
12 False
13 True
14 True

     - 14.islower 和 isupper | 判断字符串是否全都是大、小写

 1 name = 'aLeX'
 2 v = name.islower()
 3 v2 = name.isupper()
 4 print(v)
 5 print(v2)
 6 print(name.upper())
 7 print(name.lower())
 8 
 9 ---
10 False
11 False
12 ALEX
13 alex

     - 15.isprintable | 是否包含隐含的 ' ' ' ' 'a'...

 1 desc = 'aaa121212---.'
 2 name = 'alex 	sss'
 3 v = name.isprintable()
 4 v2 = desc.isprintable()
 5 print(v)
 6 print(v2)
 7 
 8 ---
 9 False
10 True

     - 16.isspace | 是否全部是空格

 1 name = '    '
 2 name2 = '    .'
 3 v = name.isspace()
 4 v2 = name2.isspace()
 5 print(v)
 6 print(v2)
 7 
 8 ---
 9 True
10 False

     - 17.join | 字符串/子序列拼接

 1 str = 'alexall'
 2 list = ['A','L','E','X']
 3 v = '-'.join(str)
 4 v2 = ''.join(list)
 5 v3 = '<-->'.join(list)
 6 print(v)
 7 print(type(v2),v2)
 8 print(type(v3),v3)
 9 
10 ---
11 a-l-e-x-a-l-l
12 <class 'str'> ALEX
13 <class 'str'> A<-->L<-->E<-->X

     - 18.lower, upper, swapcase | 大小写转换:全部变小写、全部变大写、大小写全部对换 

 1 name = 'AleX'
 2 v = name.lower()
 3 v2 = name.upper()
 4 v3 = name.swapcase()
 5 print(v)
 6 print(v2)
 7 print(v3)
 8 
 9 ---
10 alex
11 ALEX
12 aLEx

     - 19.strip, rstrip, lstrip | 移除空白,' ',' ',也可以自定义要移除的字符

 1 name2 = '   standby     '
 2 v2 = name2.strip()
 3 v3 = name2.lstrip()
 4 v4 = name2.rstrip()
 5 print(v2)
 6 print(v3)
 7 print(v4)
 8 
 9 ---
10 standby
11 standby     
12    standby
1 name = 'alex'
2 v = name.strip("x")
3 v2 = name.strip("a")
4 print(v)
5 print(v2)
6 
7 ---
8 ale
9 lex

    - 20.maketrans 和 translate | 对应关系 + 翻译

1 m = str.maketrans('hello','12345') # 对应关系
2 name = "---->hello@world<-----"
3 v = name.translate(m)
4 print(v)
5 
6 ---
7 ---->12445@w5r4d<-----

    - 21.partition,rpartition | 分割字符串,并保留自定义的分隔符;arg1 -> 分隔符;则返回一个3元的元组,第一个为分隔符左边的子串,第二个为分隔符本身,第三个为分隔符右边的子串。

1 name = 'standby'
2 v = name.partition('nd')
3 print(type(v),v)
4 v1 = name.split('nd')
5 print(type(v1),v1)
6 
7 ---
8 <class 'tuple'> ('sta', 'nd', 'by')           <-- 元组,并且保留了自定义的分隔符: nd
9 <class 'list'> ['sta', 'by']                  <-- 列表,去掉了自定义的分隔符
1 name = 'standby--nd++'
2 v = name.partition('nd')
3 v2 = name.rpartition('nd')
4 print(type(v),v)
5 print(type(v2),v2)
6 
7 ---
8 <class 'tuple'> ('sta', 'nd', 'by--nd++')
9 <class 'tuple'> ('standby--', 'nd', '++')

    - 22.replace | 替换; arg1 -> 匹配的子序列; arg2 -> 指定替换后的子序列; arg3 -> 替换的个数

 1 content = "巴基斯坦help中国help俄罗斯help中国"
 2 print(content)
 3 v = content.replace('help','Love')
 4 print(v)
 5 v = content.replace('help','Love',2)
 6 print(v)
 7 
 8 ---
 9 巴基斯坦help中国help俄罗斯help中国
10 巴基斯坦Love中国Love俄罗斯Love中国
11 巴基斯坦Love中国Love俄罗斯help中国

    - 23.split, rsplit | 通过指定分隔符 arg1 对字符串进行切片,如果参数 arg2 有指定值,则仅分隔 arg2 个子序列

 1 name = 'standby--nd++And######worldnd@@@.'
 2 v = name.split('nd')
 3 v2 = name.rsplit('nd')
 4 v3 = name.split('nd',2)
 5 v4 = name.rsplit('nd',2)
 6 print(type(v),v)
 7 print(type(v2),v2)
 8 print(type(v3),v3)
 9 print(type(v4),v4)
10 
11 ---
12 <class 'list'> ['sta', 'by--', '++A', '######world', '@@@.']
13 <class 'list'> ['sta', 'by--', '++A', '######world', '@@@.']
14 <class 'list'> ['sta', 'by--', '++And######worldnd@@@.']
15 <class 'list'> ['standby--nd++A', '######world', '@@@.']

    - 24. zfill | 填充0; arg1 -> 指定总长度,包括已有字符串长度;

1 name = "alex"
2 v = name.zfill(10)
3 print(v)
4 
5 ---
6 000000alex

   - 扩展补充

    - 切片

 1 desc = 'Hello @_@ world.'
 2 print(desc)
 3 print(desc[0])
 4 print(desc[3:7])
 5 print(desc[0:8:2])
 6 
 7 ---
 8 Hello @_@ world.
 9 H
10 lo @
11 Hlo@

     - 求长度和 for循环遍历

1 desc = 'Hello @_@ world.'
2 print(len(desc))
3 for i in desc:
4     print(i)
5 for i in range(0, len(desc)):
6     print(desc[i])

- 整数/int

  - 类型  不可变(immutable)

 1 >>> num=1
 2 >>> id(num)         <-- 查看num的内存地址
 3 1795490256
 4 >>> num2=1      <-- 给num2赋予同样的值:1
 5 >>> id(num2)        <-- num2 和 num 引用的是同一个内存地址,可见 Python3 在内存中为每一个值只保存一份;
 6 1795490256
 7 >>>
 8 >>> num=9            <-- 给num重新赋值:9
 9 >>> id(num)          <-- num 的内存地址已经更改了,所以int值是不可变类型的!
10 1795490512
11 >>> id(num2)
12 1795490256
13 >>>
14 >>> num
15 9
16 >>> num2
17 1
18 >>>

   - 基础功能

    - 1.bit_length | 查看某整数用二进制表示时的最小位数; 可以用 'bin()' 函数获得整数的二进制表示形式;

 1 print("十进制".ljust(5),"二进制".ljust(5), "二进制表示的最小位数")
 2 for i in range(1,9):
 3     print(str(i).ljust(10), bin(i).ljust(10), i.bit_length())
 4 
 5 ---
 6 十进制   二进制   二进制表示的最小位数
 7 1          0b1        1
 8 2          0b10       2
 9 3          0b11       2
10 4          0b100      3
11 5          0b101      3
12 6          0b110      3
13 7          0b111      3
14 8          0b1000     4

    - 2.to_bytes | 获取指定整数的字节按照大小端序进行表示

 1 num_list = [254,255,256,257]
 2 for age in num_list:
 3     print("%s  大端序  -->  %s" % (age, age.to_bytes(4,'big')))
 4     print("%s  小端序  -->  %s" % (age, age.to_bytes(4,'little')))
 5 
 6 ---
 7 254  大端序  -->  b'x00x00x00xfe'
 8 254  小端序  -->  b'xfex00x00x00'
 9 255  大端序  -->  b'x00x00x00xff'
10 255  小端序  -->  b'xffx00x00x00'
11 256  大端序  -->  b'x00x00x01x00'
12 256  小端序  -->  b'x00x01x00x00'
13 257  大端序  -->  b'x00x00x01x01'
14 257  小端序  -->  b'x01x01x00x00'

    - 3.from_bytes | 把指定大小端序的bytes对象转换成十进制整数表示

1 num_byte_list = [b'x00x00x00xfe', b'x00x00x00xff', b'x00x00x01x00', b'x00x00x01x01']
2 for by in num_byte_list:
3     print("%s  大端序转换为十进制数  -->  %d" % (by, int.from_bytes(by, 'big')))
4 
5 ---
6 b'x00x00x00xfe'  大端序转换为十进制数  -->  254
7 b'x00x00x00xff'  大端序转换为十进制数  -->  255
8 b'x00x00x01x00'  大端序转换为十进制数  -->  256
9 b'x00x00x01x01'  大端序转换为十进制数  -->  257

- 布尔值/bool

  - 类型  不可变(immutable)

  - 基础功能

    - 1.整数里只有0是 False,其他都是 True

    - 2.字符串里只有 "" 是 False,其他均是 True

    - 3.如果列表为空,即[] 视为 False,其他均是 True

  - 扩展补充

    - 经常会把 'while True' 这样用作最外层的循环使用;

- 列表/list

  - 类型  可变类型

  -基础功能

    - 1.append | 追加元素到列表

1 user_list = ['alex','eric','jerry','tim','alven']
2 v = user_list.append('beric')
3 print(v)
4 print(user_list)
5 
6 ---
7 None
8 ['alex', 'eric', 'jerry', 'tim', 'alven', 'beric']

    - 2.clear | 清空列表元素

1 user_list = ['alex','eric','jerry','tim','alven']
2 user_list.clear()
3 print(user_list)
4 
5 ---
6 []

    - 3.copy | 拷贝列表(浅拷贝)

1 user_list = ['alex','eric','jerry','tim','alven']
2 v = user_list.copy()
3 print(v)
4 print(user_list)
5 
6 ---
7 ['alex', 'eric', 'jerry', 'tim', 'alven']
8 ['alex', 'eric', 'jerry', 'tim', 'alven']

    - 4.count | 计算列表里某个元素重复的个数

1 user_list = ['alex','eric','jerry','tim','alven','tim']
2 v = user_list.count('tim')
3 print(v)
4 
5 ---
6 2

    - 5.extend | 扩展原列表

1 user_list = ['jerry','tim','alven']
2 user_list.extend(['beric','jakie'])
3 print(user_list)
4 
5 ---
6 ['jerry', 'tim', 'alven', 'beric', 'jakie']

    - 6.index | 查找元素索引/下标值;(没有则报错:ValueError: 'xxx' is not in list)

1 user_list = ['alex','eric','jerry','tim','alven']
2 v = user_list.index('tim')
3 # v = user_list.index('tim1')
4 print(v)
5 
6 ---
7 3

    - 7.insert | 在 arg1 索引处插入 arg2 这个元素

1 user_list = ['alex','eric','jerry','tim','alven']
2 user_list.insert(0,'tom')
3 print(user_list)
4 
5 ---
6 ['tom', 'alex', 'eric', 'jerry', 'tim', 'alven']

    - 8.pop | 删除并且获取元素 (按照索引/下标值进行 pop; 不加参数则默认pop出最后一个元素)

1 user_list = ['alex','eric','jerry','tim']
2 # v = user_list.pop()
3 v = user_list.pop(2)
4 print(v)
5 print(user_list)
6 
7 ---
8 jerry
9 ['alex', 'eric', 'tim']

    - 9.remove | 删除列表中的某个元素,arg1 是列表中的值;

1 user_list = ['alex','eric','tim','alven']
2 user_list.remove('eric')
3 print(user_list)
4 
5 ---
6 ['alex', 'tim', 'alven']

    - 10.reverse | 翻转,将列表逆序

 1 user_list = ['jerry','tim','alven']
 2 print(user_list)
 3 v = user_list.reverse()
 4 print(v)
 5 print(user_list)
 6 
 7 ---
 8 ['jerry', 'tim', 'alven']
 9 None
10 ['alven', 'tim', 'jerry']

    - 11.sort | 排序(sort(self, key=None, reverse=False)); arg1 暂时没讲; arg2 True则是逆序,不写或者False就是顺序;

 1 num_list = [11,3,8,99,21,4]
 2 print(num_list)
 3 num_list.sort()
 4 print(num_list)
 5 num_list.sort(reverse=True)
 6 print(num_list)
 7 
 8 ---
 9 [11, 3, 8, 99, 21, 4]
10 [3, 4, 8, 11, 21, 99]
11 [99, 21, 11, 8, 4, 3]

  - 扩展补充

     - 切片(和字符串切片类似)

1 li =['alex','eric','rain','tim','jerry']
2 print(li[0])
3 print(li[0:3])
4 print(li[0:4:2])
5 
6 ---
7 alex
8 ['alex', 'eric', 'rain']
9 ['alex', 'rain']

    - 删除(结合切片功能实现删除多个元素)

1 li =['alex','eric','rain','tim','jerry']
2 print(li)
3 del li[1:4]
4 print(li)
5 
6 ---
7 ['alex', 'eric', 'rain', 'tim', 'jerry']
8 ['alex', 'jerry']

    - 求长度和 for 循环遍历

1 li =['alex','eric','rain','tim','jerry']
2 print(len(li))
3 for i in li:
4     print(i)
5 for i in range(0, len(li)):
6     print(li[i]) 

- 元组/tuple

  - 类型  不可变(immutable)

 1 user_tuple = ('alex','eric','alex',)
 2 print(user_tuple[0])
 3 user_tuple[0] = 'li'
 4 
 5 ---
 6 alex
 7 Traceback (most recent call last):
 8   File "D:/soft/work/Python_17/day02/s03.py", line 27, in <module>
 9     user_tuple[0] = 'li'
10 TypeError: 'tuple' object does not support item assignment

  - 基础功能

    - 1.count | 获取元素出现的个数

1 user_tuple = ('alex','eric','alex',)
2 v = user_tuple.count('alex')
3 print(v)
4 
5 ---
6 2

    - 2.index | 获取指定元素第一个索引位置

1 user_tuple = ('alex','eric','alex',)
2 v = user_tuple.index('alex')
3 print(v)
4 
5 ---
6 0

  - 扩展补充

    - 元组赋值最后需要加一个 ','

1 li = ('alex')          <--  由于元组赋值最后没有加 ',' 导致被解释器理解为 str 类型
2 tpl = ('alex',)          <--  正确写法 
3 print(type(li),li)
4 print(type(tpl),tpl)
5 
6 ---
7 <class 'str'> alex
8 <class 'tuple'> ('alex',)

    - 长度可以用 len() 获取

    - 循环遍历元组

1 user_tuple = ('alex','eric','alex',)
2 for i in user_tuple:
3     print(i)
4 
5 ---
6 alex
7 eric
8 alex

    - 切片

 1 user_tuple = ('alex','eric','jerry','mark','tim','li',)
 2 print(user_tuple[0:2])
 3 print(user_tuple[0:5:2])
 4 print(user_tuple[-1])
 5 print(user_tuple[-3:-1])
 6 
 7 ---
 8 ('alex', 'eric')
 9 ('alex', 'jerry', 'tim')
10 li
11 ('mark', 'tim')

    - 关于元组里面嵌套列表

 1 user_tuple = ('eric','seven',['谢霆锋','王旭','王强'],'alex',)
 2 print(type(user_tuple), user_tuple, len(user_tuple))
 3 print(user_tuple)
 4 print(type(user_tuple[2]), user_tuple[2])
 5 user_tuple[2][1] = '白百合'
 6 print(user_tuple)
 7 
 8 ---
 9 <class 'tuple'> ('eric', 'seven', ['谢霆锋', '王旭', '王强'], 'alex') 4
10 ('eric', 'seven', ['谢霆锋', '王旭', '王强'], 'alex')
11 <class 'list'> ['谢霆锋', '王旭', '王强']
12 ('eric', 'seven', ['谢霆锋', '白百合', '王强'], 'alex')

> 虽然元组是不可变类型,但是里面如果嵌套了可变类型的对象(列表、字典等),例如本例中的 list对象,则可以用 [user_tuple[2][1] = '白百合'] 类似方法去修改所嵌套对象的内部元素的值;

- 字典/dict

  - 类型  可变类型

  - 基础功能

    - 1.clear | 清空一个字典

1 dic = {'k1':'v1','k2':'v2'}
2 print(dic)
3 dic.clear()
4 print(dic)
5 
6 ---
7 {'k2': 'v2', 'k1': 'v1'}
8 {}

    - 2.copy | 拷贝一个字典(浅拷贝

1 dic = {'k1':'v1','k2':'v2'}
2 v = dic.copy()
3 print(v)
4 print(dic)
5 
6 ---
7 {'k1': 'v1', 'k2': 'v2'}
8 {'k1': 'v1', 'k2': 'v2'}

    - 3.get | 根据key获取指定的value;不存在则返回 None,不报错

1 dic = {'k1':'v1','k2':'v2'}
2 v = dic.get('k1')
3 print(v)
4 v2 = dic.get('kxxx')
5 print(v2)
6 
7 ---
8 v1
9 None

    - 4.items | 获取键值对

1 dic = {'k1':'v1','k2':'v2'}
2 for item in dic.items():
3     print(item)
4 
5 ---
6 ('k1', 'v1')      <-- 元组对象
7 ('k2', 'v2')

    - 5.keys | 获取字典键值

1 dic = {'k1':'v1','k2':'v2'}
2 for item in dic.keys():
3     print(item)
4 
5 ---
6 k2
7 k1

    - 6.pop | 删除并获取对应的value值; arg1 不存在则报错;

1 dic = {'k1':'v1','k2':'v2'}
2 v = dic.pop('k1')
3 print(v)
4 print(dic)
5 
6 ---
7 v1
8 {'k2': 'v2'}

    - 7.popitem | 随机删除键值对,并获取到删除的键值;

1 dic = {'k1':'v1','k2':'v2','k3':'v3'}
2 v = dic.popitem()
3 print(v)
4 print(dic)
5 
6 ---
7 ('k2', 'v2')          <-- 获取的是元组对象
8 {'k3': 'v3', 'k1': 'v1'}

    - 8.setdefault | 增加一个元素,如果键值存在则不做操作;

1 dic = {'k1':'v1','k2':'v2'}
2 dic.setdefault('k3','v3')
3 print(dic)
4 dic.setdefault('k1','1111111')
5 print(dic)
6 
7 ---
8 {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
9 {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}

    - 9.update | 批量增加和修改

1 dic = {'k1':'v1','k2':'v2'}
2 print(dic)
3 dic.update({'k3':'v3','k1':'v24'})
4 print(dic)
5 
6 ---
7 {'k1': 'v1', 'k2': 'v2'}
8 {'k3': 'v3', 'k1': 'v24', 'k2': 'v2'}

    - 10.values | 获取字典值

1 dic = {'k1':'v1','k2':'v2'}
2 for item in dic.values():
3     print(item)
4 
5 ---
6 v2
7 v1

    - 11.fromkeys | 原型:dict.fromkeys(seq[], value); 用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值。

1 dic = dict.fromkeys(['k1','k2','k3'],'China')
2 print(dic)
3 dic['k1'] = 'Beijing'
4 print(dic)
5 
6 ---
7 {'k2': 'China', 'k3': 'China', 'k1': 'China'}
8 {'k2': 'China', 'k3': 'China', 'k1': 'Beijing'}

 - 扩展补充

    - 1.默认显示键值

1 dic = {'k1':'v1','k2':'v2'}
2 for item in dic:
3     print(item)
4 
5 ---
6 k1
7 k2

    - 2.字典可以嵌套

    - 3.字典的键值必须是不可变类型(字符串、元组、整数、布尔值等都可以)

 1 dic = {
 2     'k1': 'v1',
 3     'k2': [1,2,3,],
 4     (1,2): 'tuple',
 5     111: 'asdf',
 6     True: 'china',
 7     False: 'Japen',
 8 
 9 }
10 print(dic)
11 
12 ---
13 {'k1': 'v1', (1, 2): 'tuple', 'k2': [1, 2, 3], False: 'Japen', True: 'china', 111: 'asdf'}

      - 关于True和1

 1 dic1 = {
 2     1: '1',
 3     True: 'True',
 4     False: 'False',
 5 }
 6 dic2 = {
 7     True: 'True',
 8     1: '1',
 9     False: 'False',
10 }
11 print(dic1)
12 print(dic2)
13 
14 ---
15 {False: 'False', 1: 'True'}
16 {False: 'False', True: '1'}

- 集合

  - 类型  可变类型,可以理解为不可重复的列表,但是集合是无序的

  - 基础功能

    - 1.add | 增加一个元素到集合

1 s1 = {'eric','tony','王阳明'}
2 print(type(s1),s1)
3 s1.add('袁崇焕')
4 print(type(s1),s1)
5 
6 ---
7 <class 'set'> {'tony', 'eric', '王阳明'}
8 <class 'set'> {'tony', 'eric', '袁崇焕', '王阳明'}

    - 2.difference | s1.difference(s2)  -->  列出s1中存在,s2中不存在的元素;

 1 s1 = {'eric','tony','王阳明'}
 2 s2 = {'eric','孙承宗','王阳明'}
 3 v = s1.difference(s2)
 4 v2 = s2.difference(s1)
 5 print(v)
 6 print(v2)
 7 
 8 ---
 9 {'tony'}
10 {'孙承宗'}

    - 3.difference_update | s1.difference_update(s2)  --> s1中存在,s2中不存在,然后对s1清空,把对比出结果的赋值给s1

1 s1 = {'eric','tony','王阳明'}
2 s2 = {'eric','孙承宗','王阳明'}
3 print(s1)
4 s1.difference_update(s2)
5 print(s1)
6 
7 ---
8 {'tony', '王阳明', 'eric'}
9 {'tony'}

    - 4.discard | 移除指定元素

1 s2 = {'eric','孙承宗','王阳明'}
2 s2.discard('eric')
3 print(s2)
4 
5 ---
6 {'王阳明', '孙承宗'}

    - 5.intersection | 求交集

1 s1 = {'eric','tony','王阳明'}
2 s2 = {'eric','孙承宗','王阳明'}
3 v = s1.intersection(s2)
4 print(v)
5 
6 ---
7 {'eric', '王阳明'}

    - 6.union | 求并集

1 s1 = {'eric','tony','王阳明'}
2 s2 = {'eric','孙承宗','王阳明'}
3 v = s1.union(s2)
4 print(v)
5 
6 ---
7 {'孙承宗', 'tony', '王阳明', 'eric'}

    - 7.symmetric_difference | 求差集

1 s1 = {'eric','tony','王阳明'}
2 s2 = {'eric','孙承宗','王阳明'}
3 v = s1.symmetric_difference(s2)
4 print(v)
5 
6 ---
7 {'tony', '孙承宗'}

    - 8.pop | 随机移除一个元素,并获取

1 s2 = {'eric','孙承宗','王阳明'}
2 v = s2.pop()
3 print(s2)
4 print(v)
5 
6 ---
7 {'王阳明', 'eric'}
8 孙承宗

    - 9.remove | 删除指定值

1 s2 = {'eric','孙承宗','王阳明'}
2 s2.remove('eric')
3 print(s2)
4 
5 ---
6 {'王阳明', '孙承宗'}

    - 10.update | 批量增加,如果有则忽略

1 s1 = {'eric','tony','王阳明','tim'}
2 s2 = {'eric','孙承宗','王阳明'}
3 s2.update(s1)
4 print(s2)
5 
6 ---
7 {'孙承宗', 'eric', 'tim', '王阳明', 'tony'}

 - 扩展补充

    - 1.set 不记录元素位置或者插入点(无序)。因此,set不支持 indexing, slicing, 或其它类序列(sequence-like)的操作;

    - 2.可以用 len() 获取集合的长度;

    - 3.可以循环遍历

 1 s2 = {'eric','孙承宗','王阳明','白起','商鞅'}
 2 for i in s2:
 3     print(i)
 4 
 5 ---
 6 商鞅
 7 孙承宗
 8 王阳明
 9 eric
10 白起

    - 4.可以把list对象去重list2 = list(set(list1))

1 user_list = ['china','japan',(1,2),'china',(1,2),1]
2 print(type(user_list),len(user_list),user_list)
3 v = list(set(user_list))
4 print(type(v),len(v),v)
5 
6 ---
7 <class 'list'> 6 ['china', 'japan', (1, 2), 'china', (1, 2), 1]
8 <class 'list'> 4 [(1, 2), 1, 'china', 'japan']

四、关于循环的补充

- range 和 xrange

  - range()  | arg1 -> 起始计数; arg2 -> 终点计数; arg3 可选,代表的是步长;

 1 for i in range(0,10,2):
 2     print(i)
 3 for j in range(10,0,-2):
 4     print(j)
 5 
 6 ---
 7 0
 8 2
 9 4
10 6
11 8
12 10
13 8
14 6
15 4
16 2

  - Python 2.7

    - range(1,10) 会立即在内存中生成10个数字;

    - xrange(1,10) 不会立即生成,只有循环迭代时,才一个一个生成;

  - Python 3.5

    - 没有 xrange() 这个函数;

    - range(1,10) 等价于 Py2.7中的 xrange(0,10)

  - 常把 range() 和for循环结合使用,遍历数组或者字符串等。

- enumerate

  - Python的内置函数,表示枚举、列举的意思

  - 函数原型:enumerate(self, iterable, start=0); arg1 必须是可遍历的; arg2 可选,即设置起始的数据下标;

  - 即对一个可遍历的数据对象(如列表、元组或字符串),enumerate会将该数据对象组合为一个索引序列,同时列出数据和数据下标

 1 li =['alex','tim','jerry']
 2 for i,ele in enumerate(li):
 3     print(i,ele)
 4 for i,ele in enumerate(li,100):
 5     print(i,ele)
 6 
 7 ---
 8 0 alex
 9 1 tim
10 2 jerry
11 100 alex
12 101 tim
13 102 jerry

五、练习

要求:

 1 """
 2 # 1. 练习题两个试卷:readme
 3 # 2. 购物系统
 4     - 个人账户,文件: user,pwd,3,余额
 5     - 商品,文件
 6     - 查看商品分页显示:
 7         li = [
 8             {...}
 9             {...}
10             {...}
11             {...}
12             {...}
13             {...}
14             {...}
15         ]
16         p = int(input('请输入页码:'))
17         start = (p -1) * 10
18         end = p * 10
19         v1 = li[start:end]
20         for i v1:
21             print(i)
22     - 个人购物记录,文件
23         查看:娃娃
24     if "al" in "alex":
25         pass
26 """

代码实现:

  1 #!/usr/bin/python
  2 # -*- coding:utf-8 -*-
  3 
  4 import getpass
  5 import time
  6 
  7 WARNING = "You have attempt 3 times which all wrong, so we have to lock your account to keep the security.

  8 You can contact the admin: admin@standby.pub"
  9 GOODS_FILE = "D:softworkPython_17day02goods_info.txt"
 10 USERS_FILE = "D:softworkPython_17day02\user_info.txt"
 11 RECORD_FILE = "D:softworkPython_17day02\record.txt"
 12 OPTIONS = "Type 1 to buy, Type 2 to select your record; 9 to exit... >>>"
 13 
 14 # f.readlines()   --> []
 15 # f.open('file',mode='a',encoding='utf-8')
 16 # user_info = "alex|123|0|900
eric|124|0|800
rain|125|0|666
tim|123|0|1000"
 17 # with open('user_info.txt',mode='w',encoding='utf-8') as f:
 18 #     f.write(user_info)
 19 
 20 # 购物主函数
 21 def do_shopping(user_name):
 22     goods_list = []
 23     buy_array = {}
 24     with open(GOODS_FILE,mode='r',encoding='utf-8') as f:
 25         goods_info = f.readlines()
 26         for line in goods_info:
 27             goods_dict = {
 28                 'name':line.split('|')[0],
 29                 'price':line.split('|')[1],
 30             }
 31             goods_list.append(goods_dict)
 32     while True:
 33         page_num = input("
Input page num >>> ")
 34         if page_num.isdigit():
 35             num = int(page_num)
 36             if 0 == len(goods_info)%3:
 37                 # // 整除     / 带余数
 38                 pages_num = len(goods_info)//3
 39             else:
 40                 pages_num = len(goods_info)//3 + 1
 41             if num >= 1 and pages_num >= num:
 42                 # 1 -> 0-2; 2 -> 3-5; 3 -> 6-8;...
 43                 start_num = num*3-3
 44                 end_num = num*3
 45                 tmp_list = goods_info[start_num:end_num]
 46                 for i,ele in enumerate(tmp_list,1):
 47                     line = '	'.join(tmp_list[i-1].split('|')).expandtabs(20)
 48                     print("{}	{}".format(i,line),end='')
 49                 while True:
 50                     toBuy = input("
Buy something? y/Y to buy, n/N scan continue >>> ")
 51                     if toBuy.isalpha():
 52                         if 'Y' == toBuy.upper():
 53                             goods_num = input("Input the goods number: ")
 54                             if goods_num.isdigit():
 55                                 if int(goods_num) > 0 and int(goods_num) <4:
 56                                     count = input("How many do you want?		")
 57                                     if count.isdigit():
 58                                         index = ((num-1)*3 + int(goods_num)) - 1
 59                                         buy_array[index] = count
 60                         elif 'N' == toBuy.upper():
 61                             break
 62                         else:
 63                             print("Invalid input.")
 64                     else:
 65                         print("Invalid input.")
 66             else:
 67                 print("{} pages only.".format(pages_num))
 68         elif 'Q' == page_num.upper():
 69             print("Bye...")
 70             break
 71         else:
 72             print("Invalid input.")
 73     print("++++++++++++++++++++++++++++++++++++")
 74     print("You have choosen goods below: ")
 75     print("++++++++++++++++++++++++++++++++++++")
 76     sum = 0
 77     buy_array_tmp = {}
 78     for key,value in buy_array.items():
 79         key_num = int(key)
 80         good_name = goods_list[key_num]['name']
 81         buy_array_tmp[good_name] = value
 82         cost = int(goods_list[key_num]['price'])
 83         costs = cost * int(value)
 84         print(goods_list[key_num]['name'] + "	" + "*" + "	" + value)
 85         sum += costs
 86     print("++++++++++++++++++++++++++++++++++++")
 87     print("++++++++++++++++++++++++++++++++++++")
 88     confirm = input("Are you sure to buy them(y/n)?		")
 89     for i in range(0,len(user_list)):
 90         if user_name == user_list[i]['name']:
 91             money = user_list[i]['money']
 92             user_id = i
 93     if "y" == confirm:
 94         if money < sum:
 95             print("Sorry, your credit is running low...")
 96         else:
 97             do_record(user_name,buy_array_tmp)
 98             user_list[user_id]['money'] = money - sum
 99             print("The payment has been successfully completed and you have %d$ left." % (money - sum))
100     else:
101         print("Bye...")
102         exit(0)
103 
104 # 把当前用户购物记录追加到文件中
105 def do_record(username, buy_array_tmp):
106     line = "
"
107     for goods_name,count in buy_array_tmp.items():
108         line = line + username + "|" + goods_name + "|" + count + "|" + 
109           time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
110     with open(RECORD_FILE,mode='a',encoding='utf-8') as f:
111         f.write(line)
112 
113 # 读取用户信息
114 def get_user_list():
115     user_list = []
116     with open(USERS_FILE,mode='r',encoding='utf-8') as f:
117         data = f.read()
118         user_info = data.split('
')
119         for user in user_info:
120             user_dict = {'name': user.split('|')[0], 'pwd': user.split('|')[1],
121              'times': int(user.split('|')[2]), 'money':int(user.split('|')[3])}
122             user_list.append(user_dict)
123     return user_list
124 
125 # 查找购物记录
126 def do_select_record(user_name):
127     while True:
128         key = input("Input keyword, q/Q to exit >>> ")
129         if 'Q' != key.upper():
130             with open(RECORD_FILE,mode='r',encoding='utf-8') as f:
131                 record_list = f.readlines()
132                 flag = -1
133                 for record in record_list:
134                     if user_name in record and key in record:
135                         print(record)
136                         flag = 0
137                 if -1 == flag:
138                     print("No record found...")
139         else:
140             break
141 
142 # 执行操作前的判断
143 def do_something(user_name):
144     options = input(OPTIONS)
145     if options.isdigit():
146         if 1 == int(options):
147             do_shopping(user_name)
148         elif 2 == int(options):
149             do_select_record(user_name)
150         elif 9 == int(options):
151             print("Bye...")
152             exit(0)
153         else:
154             print("Invalid input.")
155             do_something(user_name)
156     else:
157         print("Input not number, type again...")
158         do_something(user_name)
159 
160 # 用户登录验证
161 def login():
162     count = 0
163     while count < 3:
164         name = input("Please input your name: ")
165         flag = -1
166         for item in user_list:
167             if item['name'] == name:
168                 if item['times'] >= 3:
169                     print(WARNING)
170                     exit(0)
171                 else:
172                     count = 0
173                     flag = 0
174                     pwd = getpass.getpass("Please input your password: ")
175                     if item['pwd'] == pwd:
176                         print("Welcome %s." % name)
177                         item['times'] = 0
178                         count = 3
179                         do_something(name)
180                     else:
181                         if 0 == 2-item['times']:
182                             pass
183                         else:
184                             print("Wrong password, you have %s times to retry." % (2-item['times']))
185                         item['times'] += 1
186                     if item['times'] >= 3:
187                         print(WARNING)
188                         count = 3
189                         break
190         if -1 == flag:
191             print("Invalid account, please check your user name...")
192         count += 1
193 
194 # 程序入口
195 user_list = get_user_list()
196 login()
197 
198 # 程序执行结束,格式化用户信息并写回文件
199 result = ""
200 for item in user_list:
201     user_info_str = item['name'] + "|" + item['pwd'] + "|" + str(item['times']) + "|" + str(item['money'])
202     result = result + user_info_str + "
"
203 f2 = open(USERS_FILE,'w')
204 f2.write(result.strip())
205 f2.close()

 涉及到的文件:

 1 user_info.txt:
 2 ---
 3 alex|123|0|90000
 4 eric|124|3|800
 5 rain|125|0|23
 6 tim|123|0|9619
 7 ---
 8 
 9 goods_info.txt
10 ---
11 Linux v1|129
12 Solaris beta|322
13 Free BSD|666
14 AWK cookbook|79
15 GO lang|88
16 Python lang|57
17 CentOS 6.6|333
18 CentOS 5.9|103
19 Unix-like 9|999
20 艽野尘梦|59
21 ---
22 
23 record.txt
24 ---
25 alex|Linux v1|1|2017-05-15 23:37:53
26 alex|GO lang|1|2017-05-15 23:37:53
27 alex|艽野尘梦|3|2017-05-15 23:37:53
28 tim|CentOS 6.6|3|2017-05-15 23:42:26
29 tim|艽野尘梦|1|2017-05-15 23:42:26
30 tim|AWK cookbook|2|2017-05-15 23:42:26
31 tim|艽野尘梦|1|2017-05-15 23:48:52
32 rain|Free BSD|1|2017-05-15 23:50:58
33 rain|Solaris beta|2|2017-05-15 23:52:39
34 tim|Solaris beta|1|2017-05-15 23:53:23
35 ---
作者:Standby一生热爱名山大川、草原沙漠,还有妹子
出处:http://www.cnblogs.com/standby/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/standby/p/6819815.html