1980 lines
57 KiB
Markdown
1980 lines
57 KiB
Markdown
|
# 07-Python数据类型
|
|||
|
|
|||
|
**Python有五个常用数据类型**
|
|||
|
|
|||
|
- Numbers 数字
|
|||
|
|
|||
|
- String 字符串
|
|||
|
|
|||
|
- List 列表
|
|||
|
|
|||
|
- Tuple 元组
|
|||
|
|
|||
|
- Dictionary 字典
|
|||
|
|
|||
|
- Set 集合 用来去重
|
|||
|
|
|||
|
|
|||
|
**其他分类方式**
|
|||
|
序列类型: 字符串、列表、元组、Unicode字符串,buffer对象,range对象
|
|||
|
泛映射类型: 字典
|
|||
|
集合: set()
|
|||
|
|
|||
|
## 一、数字
|
|||
|
|
|||
|
用于存储数值,是不变的数据类型,也就是说改变数字数据类型会分配一个新的对象。
|
|||
|
当你指定一个值时,Number对象就会被创建
|
|||
|
|
|||
|
```python
|
|||
|
var1 = 1
|
|||
|
var1,var2=1,10
|
|||
|
```
|
|||
|
|
|||
|
**使用del删除一些对象的引用**
|
|||
|
|
|||
|
```python
|
|||
|
del var1[,var2[,var3[....,varN]]]]
|
|||
|
```
|
|||
|
|
|||
|
例
|
|||
|
|
|||
|
```python
|
|||
|
del var
|
|||
|
del var_a, var_b
|
|||
|
```
|
|||
|
|
|||
|
**Python常用数字类型**
|
|||
|
|
|||
|
- int 有符号整型
|
|||
|
- float 浮点型
|
|||
|
|
|||
|
除了 [`int`](https://docs.python.org/zh-cn/3.12/library/functions.html#int) 和 [`float`](https://docs.python.org/zh-cn/3.12/library/functions.html#float),Python 还支持其他数字类型,例如 [`Decimal`](https://docs.python.org/zh-cn/3.12/library/decimal.html#decimal.Decimal) 或 [`Fraction`](https://docs.python.org/zh-cn/3.12/library/fractions.html#fractions.Fraction)。Python 还内置支持 [复数](https://docs.python.org/zh-cn/3.12/library/stdtypes.html#typesnumeric),后缀 `j` 或 `J` 用于表示虚数(例如 `3+5j` )。
|
|||
|
|
|||
|
**数值类型实例**
|
|||
|
|
|||
|
| int | float | complex |
|
|||
|
| ------ | ---------- | ---------- |
|
|||
|
| 10 | 0.0 | 3.14j |
|
|||
|
| 100 | 15.20 | 45.j |
|
|||
|
| -786 | -21.9 | 9.322e-36j |
|
|||
|
| 080 | 32.3+e18 | .876j |
|
|||
|
| -0490 | -90. | -.6545+0J |
|
|||
|
| -0x260 | -32.54e100 | 3e+26J |
|
|||
|
| 0x69 | 70.2-E12 | 4.53e-7j |
|
|||
|
|
|||
|
注:复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示,复数的实部a和虚部b都是浮点型
|
|||
|
|
|||
|
浮点型float
|
|||
|
|
|||
|
```python
|
|||
|
>>> f=12
|
|||
|
>>> type(f)
|
|||
|
<type 'int'>
|
|||
|
>>> f=12.0
|
|||
|
>>> type(f)
|
|||
|
<type 'float'>
|
|||
|
```
|
|||
|
|
|||
|
复数类型:应用于系统分析、信号分析、量子力学、相对论、应用数学、流体力学、碎形
|
|||
|
|
|||
|
```python
|
|||
|
>>> j=3.12
|
|||
|
>>> type(j)
|
|||
|
<type 'float'>
|
|||
|
>>> j=3.12j //在原来数字基础上加j
|
|||
|
>>> type(j)
|
|||
|
<type 'complex'>
|
|||
|
```
|
|||
|
|
|||
|
严格来讲,bool类型就是bool类型
|
|||
|
bool(布尔型)
|
|||
|
真 或 假
|
|||
|
1 或 0
|
|||
|
True 或 False
|
|||
|
|
|||
|
```python
|
|||
|
>>> a=1==1
|
|||
|
>>> a
|
|||
|
True
|
|||
|
>>> a=bool(1==1)
|
|||
|
>>> a
|
|||
|
True
|
|||
|
>>> a=bool(1=="1")
|
|||
|
>>> a
|
|||
|
False
|
|||
|
>>> type(a)
|
|||
|
<type 'bool'>
|
|||
|
```
|
|||
|
|
|||
|
## 二、字符串
|
|||
|
|
|||
|
表示文本
|
|||
|
|
|||
|
字符串是immutable的
|
|||
|
|
|||
|
**immutable -- 不可变对象**
|
|||
|
|
|||
|
具有固定值的对象。不可变对象包括 *数字、字符串和元组*。这样的对象不能被改变。如果必须存储一个不同的值,则必须创建新的对象。它们在需要常量哈希值的地方起着重要作用,例如作为字典中的键。
|
|||
|
|
|||
|
**创建字符串**
|
|||
|
使用引号创建字符串
|
|||
|
|
|||
|
```python
|
|||
|
var1 = 'Hello World!'
|
|||
|
var2 = "Python fklinux"
|
|||
|
var3 = '''Python fklinux'''
|
|||
|
```
|
|||
|
|
|||
|
### 字符串切片
|
|||
|
|
|||
|
**字符串取值顺序**
|
|||
|
1、从左到右索引默认0开始的,最大范围是字符串长度少1
|
|||
|
2、从右到左索引默认-1开始的,最大范围是字符串开头
|
|||
|
|
|||
|
用`'变量[头下标:尾下标:步长]'`,就可截取相应的字符串,其中下标是从0开始算起,可以是正数或负数,下标可以为空表示取到头或尾。
|
|||
|
|
|||
|
```python
|
|||
|
s = 'ilovepython'
|
|||
|
s[1:5]的结果是love
|
|||
|
```
|
|||
|
|
|||
|
当使用以冒号分隔的字符串,返回一个新对象,结果包含以这对偏移标识的连续内容,
|
|||
|
|
|||
|
左边的开始包含下边界,取到的最大范围不包括上边界。
|
|||
|
|
|||
|
```python
|
|||
|
#!/usr/bin/python3.8
|
|||
|
str = 'Hello World!'
|
|||
|
print (str)
|
|||
|
print (str[:])
|
|||
|
print (str[::]) # 以上3种都是输出完整字符串
|
|||
|
print (str[::1]) # 最后面的数字是步长,步长为1
|
|||
|
print (str[::2]) # 步长为2
|
|||
|
print (str[0]) # 输出字符串中的第一个字符
|
|||
|
print (str[-1]) # 输出倒数第1个字符
|
|||
|
print (str[-2]) # 输出倒数第2个字符
|
|||
|
print (str[-3:-1]) # 输出倒数第3和第2个字符
|
|||
|
print (str[-1:-3]) # 这样会有问题,因为默认是从做往右取值,可以在最后指定负值的步长表示从右往左取值
|
|||
|
print (str[-1:-3:-1])
|
|||
|
print (str[2:5]) # 输出字符串中第三个至第五个之间的字符串
|
|||
|
print (str[2:]) # 输出从第三个字符开始的字符串
|
|||
|
print (str * 2) # 输出字符串两次
|
|||
|
print (str + "TEST") # 输出连接的字符串
|
|||
|
```
|
|||
|
|
|||
|
**转义字符**
|
|||
|
需要在字符中使用特殊字符时,用反斜杠`\`转义字符。
|
|||
|
|
|||
|
| 转义字符 | 描述 |
|
|||
|
| --------- | -------------------------------------------- |
|
|||
|
| \在行尾时 | 续行符 |
|
|||
|
| \\\ | 反斜杠符号 |
|
|||
|
| \a | 响铃 |
|
|||
|
| \b | 退格(Backspace) |
|
|||
|
| \n | 换行 |
|
|||
|
| \v | 纵向制表符 |
|
|||
|
| \t | 横向制表符 |
|
|||
|
| \r | 回车 |
|
|||
|
| \f | 换页 |
|
|||
|
| \oyy | 八进制数,yy代表的字符,例如:\o12代表换行 |
|
|||
|
| \xyy | 十六进制数,yy代表的字符,例如:\x0a代表换行 |
|
|||
|
| \other | 其它的字符以普通格式输出 |
|
|||
|
|
|||
|
**原始字符串**
|
|||
|
|
|||
|
```python
|
|||
|
# 如果不想让转义字符生效,只想显示字符串原来的意思,用r定义原始字符串, r和R效果相同
|
|||
|
print(r'\t\r')
|
|||
|
实际输出为:"\t\r"
|
|||
|
```
|
|||
|
|
|||
|
**字符串运算符**
|
|||
|
下表实例变量a值为字符串"Hello",b变量值为"Python":
|
|||
|
|
|||
|
- \+ 字符串连接 a + b 输出结果: HelloPython
|
|||
|
- \* 重复输出字符串 a*2 输出结果:HelloHello
|
|||
|
- 支持成员运算符 in 和 not int
|
|||
|
|
|||
|
相邻的两个或多个 *字符串字面值* (引号标注的字符)会自动合并:
|
|||
|
|
|||
|
```python
|
|||
|
>>> 'Py' 'thon'
|
|||
|
'Python'
|
|||
|
```
|
|||
|
|
|||
|
拼接分隔开的长字符串时,这个功能特别实用:
|
|||
|
|
|||
|
```python
|
|||
|
>>> text = ('Put several strings within parentheses '
|
|||
|
... 'to have them joined together.')
|
|||
|
>>> text
|
|||
|
'Put several strings within parentheses to have them joined together.'
|
|||
|
```
|
|||
|
|
|||
|
这项功能只能用于两个字面值,不能用于变量或表达式:
|
|||
|
|
|||
|
```python
|
|||
|
>>> prefix = 'Py'
|
|||
|
>>> prefix 'thon' # can't concatenate a variable and a string literal
|
|||
|
File "<stdin>", line 1
|
|||
|
prefix 'thon'
|
|||
|
^^^^^^
|
|||
|
SyntaxError: invalid syntax
|
|||
|
>>> ('un' * 3) 'ium'
|
|||
|
File "<stdin>", line 1
|
|||
|
('un' * 3) 'ium'
|
|||
|
^^^^^
|
|||
|
SyntaxError: invalid syntax
|
|||
|
```
|
|||
|
|
|||
|
合并多个变量,或合并变量与字面值,要用 `+`:
|
|||
|
|
|||
|
```python
|
|||
|
>>> prefix + 'thon'
|
|||
|
'Python'
|
|||
|
```
|
|||
|
|
|||
|
\+可以用于字符串更新
|
|||
|
你可以对已存在的字符串进行修改,并赋值给另一个变量
|
|||
|
|
|||
|
```python
|
|||
|
#!/usr/bin/python3.8
|
|||
|
var1 = 'Hello World!'
|
|||
|
print ("更新字符串 :- ", var1[:6] + 'wing!')
|
|||
|
|
|||
|
结果:
|
|||
|
更新字符串 :- Hello wing!
|
|||
|
```
|
|||
|
|
|||
|
```python
|
|||
|
#!/usr/bin/python3.8
|
|||
|
a = "Hello"
|
|||
|
b = "Python"
|
|||
|
print ("a + b 输出结果:", a + b)
|
|||
|
print ("a * 2 输出结果:", a * 2 )
|
|||
|
print ("a[1] 输出结果:", a[1] )
|
|||
|
print ( "a[1:4] 输出结果:", a[1:4] )
|
|||
|
|
|||
|
if( "H" in a) :
|
|||
|
print ("H 在变量 a 中" )
|
|||
|
else :
|
|||
|
print("H 不在变量 a 中" )
|
|||
|
|
|||
|
if( "M" not in a) :
|
|||
|
print("M 不在变量 a 中" )
|
|||
|
else :
|
|||
|
print("M 在变量 a 中")
|
|||
|
|
|||
|
print(r'\n')
|
|||
|
print(R'\n')
|
|||
|
|
|||
|
结果:
|
|||
|
a + b 输出结果: HelloPython
|
|||
|
a * 2 输出结果: HelloHello
|
|||
|
a[1] 输出结果: e
|
|||
|
a[1:4] 输出结果: ell
|
|||
|
H 在变量 a 中
|
|||
|
M 不在变量 a 中
|
|||
|
\n
|
|||
|
\n
|
|||
|
```
|
|||
|
|
|||
|
### 格式化打印
|
|||
|
|
|||
|
python2格式化方法:使用%
|
|||
|
|
|||
|
```python
|
|||
|
#!/usr/bin/python
|
|||
|
print("My name is %s and ===========weight\t\n is %d kg!" % ('Zara', 21))
|
|||
|
%s 字符串
|
|||
|
%d 整数
|
|||
|
%f 浮点数
|
|||
|
结果:
|
|||
|
My name is Zara and weight is 21 kg!
|
|||
|
|
|||
|
注:Bash格式化打印语法
|
|||
|
# printf "...%d %f %s" 5 6.3 "hello"
|
|||
|
```
|
|||
|
|
|||
|
python3格式化方法:主打format
|
|||
|
|
|||
|
```python
|
|||
|
In [4]: print( '{0},{1}'.format('hello',2) )
|
|||
|
hello,2
|
|||
|
|
|||
|
In [88]: print('{1}----{0}'.format('hello',2))
|
|||
|
2----hello
|
|||
|
|
|||
|
In [5]: print('{},{},{}'.format('hello',2,3))
|
|||
|
hello,2,3
|
|||
|
|
|||
|
In [6]: print ( '{name},{gender},{age}' . format (age = 32 ,gender = 'male' ,name = 'liying' ))
|
|||
|
liying,male,32
|
|||
|
|
|||
|
# 格式限定符
|
|||
|
# 它有着丰富的的"格式限定符"(语法是{}中带:号),比如:
|
|||
|
|
|||
|
# 填充与对齐,填充常跟对齐一起使用
|
|||
|
# ^、<、>分别是居中、左对齐、右对齐,后面带宽度
|
|||
|
# :号后面带填充的字符,只能是一个字符,不指定默认是用空格填充
|
|||
|
# 8是字符串宽度
|
|||
|
In [9]: print ( '{:>8}' . format ( 'liying' )) # 没有指定填充字符,默认用空格填充
|
|||
|
liying
|
|||
|
In [9]: print ( '{1:>8}' . format ( 'liying' )) # 没有指定填充字符,默认用空格填充
|
|||
|
liying
|
|||
|
# 1代表的是索引位置
|
|||
|
|
|||
|
In [10]: print ( '{:0>8}' . format ( 'liying' )) # 用0填充
|
|||
|
00liying
|
|||
|
In [11]: print ( '{:a>8}' . format ( 'liying' )) # 用字符a填充
|
|||
|
aaliying
|
|||
|
|
|||
|
# 精度与类型f,精度常跟类型f一起使用
|
|||
|
In [13]: print ( '{:.2f}' . format ( 31.31412 )) # 指定小数点位数为2位
|
|||
|
31.31
|
|||
|
In [101]: print('{:>10.3f}'.format(3.1415926)) # >10 指定宽度为10且右对齐
|
|||
|
3.142
|
|||
|
|
|||
|
# 进制,b、d、o、x分别是二进制、十进制、八进制、十六进制
|
|||
|
In [15]: print ( '{:b}' . format ( 15 ))
|
|||
|
1111
|
|||
|
In [16]: print ( '{:d}' . format ( 15 ))
|
|||
|
15
|
|||
|
In [17]: print ( '{:o}' . format ( 15 ))
|
|||
|
17
|
|||
|
In [18]: print ( '{:x}' . format ( 15 ))
|
|||
|
f
|
|||
|
|
|||
|
# 用逗号做金额的千位分隔符
|
|||
|
In [22]: print ( '{:,}' . format ( 123456789 ))
|
|||
|
123,456,789
|
|||
|
```
|
|||
|
|
|||
|
python3.0 print函数新语法,可以让print附带参数
|
|||
|
|
|||
|
```python
|
|||
|
>>> print("a",sep=':')
|
|||
|
a:b
|
|||
|
|
|||
|
In [109]: print("abc","def",sep="|",end='')
|
|||
|
abc|def
|
|||
|
separater end
|
|||
|
```
|
|||
|
|
|||
|
三引号(triple quotes) 可以将复杂的字符串进行复制,允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。
|
|||
|
|
|||
|
```python
|
|||
|
>>> hi ='''hi there'''
|
|||
|
>>> hi ='''hi\nthere'''
|
|||
|
```
|
|||
|
|
|||
|
### 字符串方法
|
|||
|
|
|||
|
| 方法 | 描述 |
|
|||
|
| ------------------------------------------------- | ------------------------------------------------------------ |
|
|||
|
| *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.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() 方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。 |
|
|||
|
| *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 中的小写字母为大写 |
|
|||
|
| *string.zfill(width) | 返回长度为 width 的字符串,原字符串 string 右对齐,前面填充0 |
|
|||
|
| string.isdecimal() | isdecimal()方法检查字符串是否只包含十进制字符。这种方法只存在于unicode对象。 |
|
|||
|
|
|||
|
```python
|
|||
|
# 把字符串的第一个字符大写
|
|||
|
In [11]: a='hello world'
|
|||
|
In [14]: a.capitalize()
|
|||
|
Out[14]: 'Hello world'
|
|||
|
```
|
|||
|
|
|||
|
```python
|
|||
|
# 字符串的每个单词开头字符大写
|
|||
|
In [7]: import string
|
|||
|
In [8]: string.capwords("hello world")
|
|||
|
Out[9]: 'Hello World'
|
|||
|
```
|
|||
|
|
|||
|
```python
|
|||
|
# 返回一个原字符串居中,并使用空格填充至长度为 width 的新字符串,这里的宽度为20
|
|||
|
In [20]: a.center(20)
|
|||
|
Out[20]: ' hello world '
|
|||
|
```
|
|||
|
|
|||
|
```python
|
|||
|
string.count(str, beg=0, end=len(string))
|
|||
|
返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数
|
|||
|
beg开始的位置
|
|||
|
end结束的位置 ,不包括结束位置
|
|||
|
|
|||
|
In [21]: a.count('l')
|
|||
|
Out[21]: 3
|
|||
|
|
|||
|
In [22]: a.count('l',3)
|
|||
|
Out[22]: 2
|
|||
|
|
|||
|
In [23]: a.count('l',3,9)
|
|||
|
Out[23]: 1
|
|||
|
|
|||
|
In [24]: a.count('l',3,10)
|
|||
|
Out[24]: 2
|
|||
|
```
|
|||
|
|
|||
|
```python
|
|||
|
string.endswith(obj, beg=0, end=len(string))
|
|||
|
检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False.
|
|||
|
beg开始的位置
|
|||
|
end结束的位置
|
|||
|
In [25]: a.endswith('ld')
|
|||
|
Out[25]: True
|
|||
|
|
|||
|
In [28]: a.endswith('o',2,5)
|
|||
|
Out[28]: True
|
|||
|
|
|||
|
In [29]: a.endswith('o',2,4)
|
|||
|
Out[29]: False
|
|||
|
```
|
|||
|
|
|||
|
```python
|
|||
|
string.expandtabs(tabsize=8)
|
|||
|
把字符串 string 中的 tab 符号转为空格,tab 符号默认的空格数是 8。
|
|||
|
注意:这里的8最后转换后会是7个空格,如果指定成3会是2个空格
|
|||
|
|
|||
|
In [34]: a='hello\tworld'
|
|||
|
In [35]: print(a)
|
|||
|
hello world
|
|||
|
|
|||
|
In [36]: a.expandtabs()
|
|||
|
Out[36]: 'hello world'
|
|||
|
```
|
|||
|
|
|||
|
使用方法举例:
|
|||
|
|
|||
|
```python
|
|||
|
In [9]: hero = "i'm wing"
|
|||
|
In [10]: hero.title()
|
|||
|
Out[10]: "I'M Wing"
|
|||
|
```
|
|||
|
|
|||
|
也可以直接使用模块实现各种字符串方法:
|
|||
|
|
|||
|
```python
|
|||
|
In [13]: import string
|
|||
|
|
|||
|
In [14]: hero="i am wing"
|
|||
|
|
|||
|
In [15]: string.capwords(hero)
|
|||
|
Out[15]: 'I Am Wing'
|
|||
|
```
|
|||
|
|
|||
|
**大小写转化**
|
|||
|
|
|||
|
```python
|
|||
|
#vim upper_lower_string.py
|
|||
|
#!/usr/bin/python3.8
|
|||
|
string = "Hello Wing"
|
|||
|
print(string.lower())
|
|||
|
print(string.upper())
|
|||
|
|
|||
|
结果如下
|
|||
|
# python upper_lower_string.py
|
|||
|
hello wing
|
|||
|
HELLO WING
|
|||
|
```
|
|||
|
|
|||
|
**去除空白**
|
|||
|
|
|||
|
```python
|
|||
|
#!/usr/bin/python3.8
|
|||
|
string = "\nhello,this is a strip test\n"
|
|||
|
string_1 = "<hello,this is a strip test>"
|
|||
|
a="-"
|
|||
|
for i in range(4):
|
|||
|
print (a*40)
|
|||
|
if i == 0:
|
|||
|
print ("'string'变量所存储字符串的原始打印格式为:")
|
|||
|
print (string)
|
|||
|
elif i == 1:
|
|||
|
print ("'string'使用字符串方法'lstrip'后去掉了字符串前面的空白,打印格式为:")
|
|||
|
print (string.lstrip())
|
|||
|
elif i == 2:
|
|||
|
print ("'string'使用字符串方法'rstrip'后去掉了字符串后面的空白,打印格式为:")
|
|||
|
print (string.rstrip())
|
|||
|
else:
|
|||
|
print ("'string'使用字符串方法'strip'后去掉了字符串前面和后面的空白,打印格式为:")
|
|||
|
print (string.strip())
|
|||
|
else:
|
|||
|
print (a*40)
|
|||
|
print ('注:在lstrip()、rstrip()、strip()没有参数的情况下会删除空白,"tab、空格、换行、回车"都属于"空白"')
|
|||
|
|
|||
|
for i in range(4):
|
|||
|
print (a*40)
|
|||
|
if i == 0:
|
|||
|
print ("'string_1'变量所存储字符串的原始打印格式为:")
|
|||
|
print (string_1)
|
|||
|
elif i == 1:
|
|||
|
print ('''"string_1"使用字符串方法lstrip("<")后去掉了字符串前面的"<",打印格式为:''')
|
|||
|
print (string_1.lstrip("<"))
|
|||
|
elif i == 2:
|
|||
|
print ( '''"string_1"使用字符串方法rstrip(">")后去掉了字符串后面的">",打印格式为:''')
|
|||
|
print (string_1.rstrip(">"))
|
|||
|
else:
|
|||
|
print ('''"string_1"使用字符串方法strip("<").strip(">")后去掉了字符串前面和后面的空白,打印格式为:''')
|
|||
|
print ( string_1.strip("<").strip(">"))
|
|||
|
else:
|
|||
|
print ( a*40)
|
|||
|
print ('注:也可以添加参数作为被删除的字符串,也就是说可以利用这3中方法删除原始字符串前后的任意指定字符串')
|
|||
|
```
|
|||
|
|
|||
|
**分割字符串**
|
|||
|
|
|||
|
split()用来分割字符串
|
|||
|
|
|||
|
splitlines()用来按行分割字符串
|
|||
|
|
|||
|
```python
|
|||
|
#!/usr/bin/env python3.8
|
|||
|
string = "a-b-c"
|
|||
|
string1 = "a---b---c"
|
|||
|
string2 = "hello,this is my first using of split,are you ok?yes,I am ok"
|
|||
|
print(string.split("-")) #可以指定单个分割符
|
|||
|
print( string1.split("---")) #也可以指定多个字符当作分割符
|
|||
|
print(string1.split("--"))
|
|||
|
print(string2.split(",",2)) #还可以指定分割符的最大使用次数,这里是只使用两次
|
|||
|
```
|
|||
|
|
|||
|
```python
|
|||
|
string3 = "This is a multiline text"
|
|||
|
print (string3.split()) #不加参数,默认将空格当作分割符
|
|||
|
|
|||
|
string4 = '''This is
|
|||
|
a multiline piece of
|
|||
|
text'''
|
|||
|
print (string4.split()) #如果是多行文本,默认也是按空格分割
|
|||
|
print (string4.splitlines()) #如果想按行分割,可以使用splitlines()方法
|
|||
|
```
|
|||
|
|
|||
|
Python的str类有split方法,但是这个split方法只能根据指定的某个字符分隔字符串,如果要同时指定多个字符来分隔字符串,该怎么办呢?幸运的是python的re模块中提供的split方法可以用来做这件事情
|
|||
|
|
|||
|
```
|
|||
|
import re
|
|||
|
re.split('; |, ',str)
|
|||
|
```
|
|||
|
|
|||
|
例如:
|
|||
|
|
|||
|
```python
|
|||
|
>>> a='Beautiful, is; better*than\nugly'
|
|||
|
>>> import re
|
|||
|
>>> re.split('; |, |\*|\n',a)
|
|||
|
['Beautiful', 'is', 'better', 'than', 'ugly']
|
|||
|
```
|
|||
|
|
|||
|
**拼接字符串**
|
|||
|
|
|||
|
方法很多,其中join()方法性能最好,只是注意join处理的是列表
|
|||
|
|
|||
|
```python
|
|||
|
#!/usr/bin/env python3.8
|
|||
|
somelist = ['one','two','three','four']
|
|||
|
print (','.join(somelist) ) #使用方法前面指定的分割符连接列表元素
|
|||
|
print (', '.join(somelist))
|
|||
|
print ('\t'.join(somelist))
|
|||
|
print (''.join(somelist) )
|
|||
|
|
|||
|
# 注意:join()是字符串方法,如果你给他的参数是一串数字会报错!
|
|||
|
numlist = [1,2,3,4,5]
|
|||
|
# print ','.join(numlist) //这种方式直接会报错
|
|||
|
|
|||
|
# 可以使用下面的方式转换数字为字符串
|
|||
|
print (','.join([str(i) for i in numlist])) # 列表表达式
|
|||
|
print (','.join(str(i) for i in numlist))
|
|||
|
```
|
|||
|
|
|||
|
**取26个英文字母**
|
|||
|
|
|||
|
```python
|
|||
|
In [9]: string.ascii_lowercase
|
|||
|
Out[9]: 'abcdefghijklmnopqrstuvwxyz'
|
|||
|
```
|
|||
|
**中文内容处理**
|
|||
|
|
|||
|
注:python3不用处理即可使用
|
|||
|
|
|||
|
如果文件内容是中文:
|
|||
|
read方法读出来之后是16进制方式,需要用print打印
|
|||
|
|
|||
|
如果使用readlines读文件,文件内容会被放到列表里,想显示中文必须使用for循环print列表元素才能显示中文
|
|||
|
比如:
|
|||
|
|
|||
|
```python
|
|||
|
[root@wing python]# cat a.txt
|
|||
|
中文
|
|||
|
la
|
|||
|
In [62]: f=open('a.txt','r')
|
|||
|
|
|||
|
In [63]: content=f.readlines()
|
|||
|
|
|||
|
In [64]: content
|
|||
|
Out[64]: ['中文\n']
|
|||
|
|
|||
|
In [65]: for i in content:
|
|||
|
....: print (i)
|
|||
|
....:
|
|||
|
中文
|
|||
|
```
|
|||
|
|
|||
|
替换字符
|
|||
|
|
|||
|
```python
|
|||
|
str.maketrans 生成映射
|
|||
|
str.translate 替换字符
|
|||
|
>>> str="abcdefg"
|
|||
|
>>> str.translate(str.maketrans("abcd","1234"))
|
|||
|
'1234efg'
|
|||
|
```
|
|||
|
|
|||
|
----------------------------
|
|||
|
|
|||
|
shell相关字符串处理
|
|||
|
|
|||
|
用sed作文本的大小写替换
|
|||
|
|
|||
|
```bash
|
|||
|
# sed 's/[a-z]/\u&/g' /etc/passwd
|
|||
|
# sed 's/[A-Z]/\l&/g' a
|
|||
|
```
|
|||
|
|
|||
|
删除文件倒数第二行:
|
|||
|
|
|||
|
```bash
|
|||
|
# sed '{N;$!P;D}' a.txt
|
|||
|
```
|
|||
|
|
|||
|
翻转文本内容:
|
|||
|
|
|||
|
```bash
|
|||
|
# tac a.txt
|
|||
|
```
|
|||
|
|
|||
|
大小写替换
|
|||
|
|
|||
|
```bash
|
|||
|
# echo HEllo Word | tr a-z A-Z
|
|||
|
HELLO WORLD
|
|||
|
```
|
|||
|
|
|||
|
使用shell命令翻转字符串
|
|||
|
|
|||
|
```bash
|
|||
|
# a=abcdefg
|
|||
|
# echo $a | rev
|
|||
|
gfedcba
|
|||
|
```
|
|||
|
|
|||
|
----------------------
|
|||
|
|
|||
|
## 三、列表
|
|||
|
|
|||
|
打印一个产品信息的界面
|
|||
|
|
|||
|
欢迎来到千锋饮料售卖机
|
|||
|
|
|||
|
产品列表
|
|||
|
|
|||
|
名字 剩余量 单价
|
|||
|
|
|||
|
购买
|
|||
|
|
|||
|
上货
|
|||
|
|
|||
|
[]()
|
|||
|
**序列**
|
|||
|
序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推,Python已经内置确定序列的长度以及确定最大和最小的元素的方法。Python有6个序列的内置类型,最常见的是列表和元组。
|
|||
|
|
|||
|
**序列操作包括**
|
|||
|
索引,切片,加,乘,检查成员
|
|||
|
|
|||
|
**列表**
|
|||
|
|
|||
|
与 [immutable](https://docs.python.org/zh-cn/3.12/glossary.html#term-immutable) 字符串不同, 列表是 [mutable](https://docs.python.org/zh-cn/3.12/glossary.html#term-mutable) 类型,其内容可以改变
|
|||
|
|
|||
|
支持字符,数字,字符串甚至可以包含列表(嵌套),他的数据项不需要具有相同的类型
|
|||
|
|
|||
|
**创建列表**
|
|||
|
以逗号分隔的不同的数据项使用方括号括起来即可。
|
|||
|
例如:
|
|||
|
|
|||
|
```python
|
|||
|
list1 = ['physics', 'chemistry', 1997, 2000]
|
|||
|
list2 = [1, 2, 3, 4, 5 ]
|
|||
|
list3 = ["a", "b", "c", "d"]
|
|||
|
list4 = [] #创建空列表
|
|||
|
list5 = list() #创建空列表
|
|||
|
```
|
|||
|
|
|||
|
**列表截取**
|
|||
|
语法:变量[头下标:尾下标]
|
|||
|
从左到右索引默认0开始的,从右到左索引默认-1开始,下标可以为空,表示取到头或尾。
|
|||
|
|
|||
|
例1:
|
|||
|
|
|||
|
```python
|
|||
|
#!/usr/bin/python3.8
|
|||
|
list1 = ['physics', 'chemistry', 1997, 2000];
|
|||
|
list2 = [1, 2, 3, 4, 5, 6, 7 ];
|
|||
|
|
|||
|
print("list1[0]: ", list1[0])
|
|||
|
print("list2[1:5]: ", list2[1:5])
|
|||
|
|
|||
|
以上实例输出结果:
|
|||
|
list1[0]: physics
|
|||
|
list2[1:5]: [2, 3, 4, 5]
|
|||
|
```
|
|||
|
|
|||
|
例2:
|
|||
|
|
|||
|
```python
|
|||
|
L = ['spam', 'Spam', 'SPAM!']
|
|||
|
```
|
|||
|
|
|||
|
操作:
|
|||
|
|
|||
|
| Python 表达式 | 结果 | 描述 |
|
|||
|
| ------------- | ----------------- | ------------------------ |
|
|||
|
| L[2] | 'SPAM!' | 读取列表中第三个元素 |
|
|||
|
| L[-2] | 'Spam' | 读取列表中倒数第二个元素 |
|
|||
|
| L[1:] | ['Spam', 'SPAM!'] | 从第二个元素开始截取列表 |
|
|||
|
|
|||
|
**更新列表**
|
|||
|
可以对列表的数据项进行修改或更新,也可以使用append()方法来添加列表项
|
|||
|
例如:
|
|||
|
|
|||
|
```python
|
|||
|
#!/usr/bin/python
|
|||
|
list = ['physics', 'chemistry', 1997, 2000];
|
|||
|
print ("Value available at index 2 : ")
|
|||
|
print (list[2])
|
|||
|
list[2] = 2001 #更新列表元素
|
|||
|
print ("New value available at index 2 : ")
|
|||
|
print (list[2])
|
|||
|
|
|||
|
以上实例输出结果:
|
|||
|
Value available at index 2 :
|
|||
|
1997
|
|||
|
New value available at index 2 :
|
|||
|
2001
|
|||
|
```
|
|||
|
|
|||
|
**删除列表元素**
|
|||
|
使用 del 语句来删除列表的的元素
|
|||
|
例
|
|||
|
|
|||
|
```python
|
|||
|
#!/usr/bin/python3.8
|
|||
|
list1 = ['physics', 'chemistry', 1997, 2000]
|
|||
|
print (list1)
|
|||
|
del list1[2]
|
|||
|
print ("After deleting value at index 2 : ")
|
|||
|
print (list1)
|
|||
|
|
|||
|
以上实例输出结果:
|
|||
|
['physics', 'chemistry', 1997, 2000]
|
|||
|
After deleting value at index 2 :
|
|||
|
['physics', 'chemistry', 2000]
|
|||
|
```
|
|||
|
|
|||
|
**列表操作符**
|
|||
|
\+ 号用于组合列表
|
|||
|
\* 号用于重复列表
|
|||
|
in 判断元素是否在列表中
|
|||
|
not in
|
|||
|
例:
|
|||
|
|
|||
|
| Python 表达式 | 结果 | 描述 |
|
|||
|
| ---------------------------- | ---------------------------- | -------------------- |
|
|||
|
| [1, 2, 3] + [4, 5, 6] | [1, 2, 3, 4, 5, 6] | 组合 |
|
|||
|
| ['Hi!'] * 4 | ['Hi!', 'Hi!', 'Hi!', 'Hi!'] | 重复 |
|
|||
|
| 3 in [1, 2, 3] | True | 元素是否存在于列表中 |
|
|||
|
| for x in [1, 2, 3]: print x, | 1 2 3 | 迭代 |
|
|||
|
|
|||
|
成员运算符可以使用for完成对列表的迭代,要按索引迭代序列,可以组合使用 [`range()`](https://docs.python.org/zh-cn/3.12/library/stdtypes.html#range) 和 [`len()`](https://docs.python.org/zh-cn/3.12/library/functions.html#len):
|
|||
|
|
|||
|
```python
|
|||
|
>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
|
|||
|
>>> for i in range(len(a)):
|
|||
|
... print(i, a[i])
|
|||
|
0 Mary
|
|||
|
1 had
|
|||
|
2 a
|
|||
|
3 little
|
|||
|
4 lamb
|
|||
|
```
|
|||
|
|
|||
|
或者自定义计数器
|
|||
|
|
|||
|
```python
|
|||
|
iterable=['a','b','c']
|
|||
|
i = 0
|
|||
|
for item in iterable:
|
|||
|
print(i, item)
|
|||
|
i += 1
|
|||
|
```
|
|||
|
|
|||
|
不过大多数情况下 [`enumerate()`](https://docs.python.org/zh-cn/3.12/library/functions.html#enumerate) 函数很方便
|
|||
|
|
|||
|
**内置函数enumrate()**
|
|||
|
为一个可迭代的对象添加序号,可迭代的对象你可以理解成能用for循环的就是可迭代的。
|
|||
|
默认是编号是从0开始,可以设置从1开始
|
|||
|
|
|||
|
```python
|
|||
|
iterable=['a','b','c']
|
|||
|
for i, item in enumerate(iterable):
|
|||
|
print(i, item)
|
|||
|
```
|
|||
|
|
|||
|
```python
|
|||
|
函数接收一个参数:默认是从0开始
|
|||
|
>>> list(enumerate('abc'))
|
|||
|
(0, 'a')
|
|||
|
(1, 'b')
|
|||
|
(2, 'c')
|
|||
|
|
|||
|
函数接收第二个参数指定开始的数字:
|
|||
|
>>> enumerate('abc', 1)
|
|||
|
(1, 'a')
|
|||
|
(2, 'b')
|
|||
|
(3, 'c')
|
|||
|
```
|
|||
|
|
|||
|
实例:
|
|||
|
|
|||
|
```python
|
|||
|
#cat test.py
|
|||
|
li = ["手机", "电脑", '鼠标垫', '游艇']
|
|||
|
for k, i in enumerate(li,1): # 这里的1表示序号从1开始
|
|||
|
print(k,i)
|
|||
|
|
|||
|
执行结果如下:
|
|||
|
1 手机
|
|||
|
2 电脑
|
|||
|
3 鼠标垫
|
|||
|
4 游艇
|
|||
|
```
|
|||
|
|
|||
|
**逆向循环**
|
|||
|
|
|||
|
为了逆向对序列进行循环,可以求出欲循环的正向序列,然后调用 [`reversed()`](https://docs.python.org/zh-cn/3.12/library/functions.html#reversed) 函数:
|
|||
|
|
|||
|
```python
|
|||
|
>>> for i in reversed(range(1, 10, 2)):
|
|||
|
... print(i)
|
|||
|
9
|
|||
|
7
|
|||
|
5
|
|||
|
3
|
|||
|
1
|
|||
|
```
|
|||
|
|
|||
|
**排序**
|
|||
|
|
|||
|
按顺序循环序列,可以用 [`sorted()`](https://docs.python.org/zh-cn/3.12/library/functions.html#sorted) 函数,在不改动原序列的基础上,返回一个新的序列:
|
|||
|
|
|||
|
```python
|
|||
|
>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
|
|||
|
>>> for i in sorted(basket):
|
|||
|
... print(i)
|
|||
|
apple
|
|||
|
apple
|
|||
|
banana
|
|||
|
orange
|
|||
|
orange
|
|||
|
pear
|
|||
|
```
|
|||
|
|
|||
|
**列表方法**
|
|||
|
|
|||
|
| 方法 |
|
|||
|
| ------------------------------------------------------------ |
|
|||
|
| list.append(obj) 在列表末尾添加新的对象 |
|
|||
|
| list.count(obj) 统计某个元素在列表中出现的次数 |
|
|||
|
| list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表) |
|
|||
|
| list.index(obj) 从列表中找出某个值第一个匹配项的索引位置 |
|
|||
|
| list.insert(index, obj) 将对象插入列表 |
|
|||
|
| list.pop(obj=list[-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值 |
|
|||
|
| list.remove(obj) 移除列表中某个值的第一个匹配项 |
|
|||
|
| list.reverse() 反向列表中元素 |
|
|||
|
| list.sort([func]) 对原列表进行排序 |
|
|||
|
|
|||
|
operator.eq(a,b) 判断两个对象是否相等 ,使用之前import operator
|
|||
|
|
|||
|
**给列表插入数据的其他方法**
|
|||
|
把被切片出来的数据替换成后面的数据
|
|||
|
|
|||
|
```python
|
|||
|
In [216]: a=['a', 'b', 'c', 'd', 'e']
|
|||
|
In [215]: a[1:4]
|
|||
|
Out[215]: ['b', 'c', 'd']
|
|||
|
|
|||
|
In [217]: a[1:4]=[1]
|
|||
|
|
|||
|
In [218]: a
|
|||
|
Out[218]: ['a', 1, 'e']
|
|||
|
```
|
|||
|
|
|||
|
在索引为1的数据之前添加后面的数据
|
|||
|
|
|||
|
```
|
|||
|
In [224]: a[1:1]=[5]
|
|||
|
|
|||
|
In [225]: a
|
|||
|
Out[225]: ['a', 5, 'b', 'c', 'd', 'e']
|
|||
|
```
|
|||
|
|
|||
|
批量替换
|
|||
|
|
|||
|
```python
|
|||
|
In [4]: a=[12, 3, 8, 8, 4, 3]
|
|||
|
In [5]: a[2:]=[1,1,1,]
|
|||
|
In [6]: a
|
|||
|
Out[6]: [12, 3, 1, 1, 1]
|
|||
|
```
|
|||
|
|
|||
|
另类删除:
|
|||
|
|
|||
|
```python
|
|||
|
In [7]: a=[12,3,4,3]
|
|||
|
In [8]: a[2:]=[]
|
|||
|
In [9]: a
|
|||
|
Out[9]: [12, 3]
|
|||
|
```
|
|||
|
|
|||
|
列表中嵌套列表:
|
|||
|
|
|||
|
```python
|
|||
|
>>> a=[1,2,['a','b']]
|
|||
|
>>> a
|
|||
|
[1, 2, ['a', 'b']]
|
|||
|
>>> a[2]
|
|||
|
['a', 'b']
|
|||
|
>>> a[2][0]
|
|||
|
'a'
|
|||
|
>>> a[2][1]
|
|||
|
'b'
|
|||
|
```
|
|||
|
|
|||
|
判断一个对象是否是一个列表(tuple,str,dict):
|
|||
|
|
|||
|
```python
|
|||
|
>>> test=[1,2,3]
|
|||
|
>>> isinstance(test,list)
|
|||
|
True
|
|||
|
```
|
|||
|
|
|||
|
变量解包:(可以用元组,列表,字典解包)
|
|||
|
|
|||
|
```python
|
|||
|
>>> l1,l2 = [[1,'x','y'],[2,'z','r']]
|
|||
|
>>> print(l1)
|
|||
|
[1, 'x', 'y']
|
|||
|
>>> print(l2)
|
|||
|
[2, 'z', 'r']
|
|||
|
```
|
|||
|
|
|||
|
**列表解包**
|
|||
|
|
|||
|
```python
|
|||
|
In [59]: li=[1,2,3,4]
|
|||
|
|
|||
|
In [60]: print(*li)
|
|||
|
1 2 3 4
|
|||
|
```
|
|||
|
|
|||
|
如果不采用解包的方法:
|
|||
|
|
|||
|
```python
|
|||
|
In [18]: a=[1, 2, 3, 4]
|
|||
|
|
|||
|
In [19]: for i in a:
|
|||
|
...: print(i,end=" ")
|
|||
|
...:
|
|||
|
1 2 3 4
|
|||
|
```
|
|||
|
|
|||
|
**slice() 函数**
|
|||
|
实现切片对象,主要用在切片操作函数里的参数传递
|
|||
|
|
|||
|
语法:
|
|||
|
class slice(stop)
|
|||
|
class slice(start, stop[, step])
|
|||
|
|
|||
|
参数说明:
|
|||
|
start -- 起始位置
|
|||
|
stop -- 结束位置
|
|||
|
step -- 间距
|
|||
|
|
|||
|
返回值
|
|||
|
返回一个切片对象。
|
|||
|
|
|||
|
实例
|
|||
|
|
|||
|
```python
|
|||
|
>>> myslice = slice(5) # 设置截取5个元素的切片
|
|||
|
>>> myslice
|
|||
|
slice(None, 5, None)
|
|||
|
>>> arr = range(10)
|
|||
|
>>> arr
|
|||
|
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
|||
|
>>> arr[myslice] # 截取 5 个元素
|
|||
|
[0, 1, 2, 3, 4]
|
|||
|
```
|
|||
|
|
|||
|
**浅拷贝**
|
|||
|
用等号将一个列表赋值给多个变量时,使用其中任意一个变量对列表的操作,结果都会同步到其他变量的值。
|
|||
|
|
|||
|
```python
|
|||
|
In [335]: a=b=[1,2,3]
|
|||
|
|
|||
|
In [336]: a
|
|||
|
Out[336]: [1, 2, 3]
|
|||
|
|
|||
|
In [337]: b
|
|||
|
Out[337]: [1, 2, 3]
|
|||
|
|
|||
|
In [338]: a[1]=8
|
|||
|
|
|||
|
In [339]: a
|
|||
|
Out[339]: [1, 8, 3]
|
|||
|
|
|||
|
In [340]: b
|
|||
|
Out[340]: [1, 8, 3]
|
|||
|
```
|
|||
|
|
|||
|
这种现象很像前面学的变量赋值,变量和列表本身之间的关系称作:变量对列表对象的引用并没有创建一个新的列表。
|
|||
|
```python
|
|||
|
In [110]: base_count = ['name',['money',100.00]]
|
|||
|
|
|||
|
In [111]: xmen = list(base_count)
|
|||
|
|
|||
|
In [112]: xpan = base_count.copy() # 浅复制
|
|||
|
|
|||
|
In [113]: xmen[1][1] = 20.00
|
|||
|
|
|||
|
In [114]: xpan
|
|||
|
Out[114]: ['name', ['money', 20.0]]
|
|||
|
```
|
|||
|
|
|||
|
**深拷贝**
|
|||
|
|
|||
|
```python
|
|||
|
In [115]: import copy
|
|||
|
|
|||
|
In [116]: xmen_new = copy.deepcopy(base_count) # 深复制
|
|||
|
|
|||
|
In [117]: xpan_new = copy.deepcopy(base_count)
|
|||
|
|
|||
|
In [118]: xpan_new[1][1] = 50.00
|
|||
|
|
|||
|
In [119]: xmen_new
|
|||
|
Out[119]: ['name', ['money', 20.0]]
|
|||
|
|
|||
|
In [120]: xpan_new
|
|||
|
Out[120]: ['name', ['money', 50.0]]
|
|||
|
```
|
|||
|
|
|||
|
**pprint和pformat**
|
|||
|
pprint模块中使用的格式化可以按照一种格式正确的显示数据, 这种格式即可被解析器解析, 又很易读.
|
|||
|
|
|||
|
**比如下面sys.path默认输出为:**
|
|||
|
注意:ipython内自带优化看不出效果,需用自带python测试
|
|||
|
|
|||
|
```python
|
|||
|
>>> import sys,pprint
|
|||
|
>>> sys.path
|
|||
|
['', '/usr/lib/python2.7/site-packages/TimeConvert-1.4.0-py2.7.egg', '/usr/lib/
|
|||
|
python2.7/site-packages/tzlocal-1.3-py2.7.egg', '/usr/lib64/python27.zip', '/usr/
|
|||
|
lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/
|
|||
|
usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload', '/usr/lib64/
|
|||
|
python2.7/site-packages', '/usr/lib64/python2.7/site-packages/gtk-2.0', '/usr/lib/
|
|||
|
python2.7/site-packages']
|
|||
|
```
|
|||
|
|
|||
|
**用pprint方法会更易读**
|
|||
|
|
|||
|
```python
|
|||
|
>>> pprint.pprint(sys.path)
|
|||
|
['',
|
|||
|
'/usr/lib/python2.7/site-packages/TimeConvert-1.4.0-py2.7.egg',
|
|||
|
'/usr/lib/python2.7/site-packages/tzlocal-1.3-py2.7.egg',
|
|||
|
'/usr/lib64/python27.zip',
|
|||
|
'/usr/lib64/python2.7',
|
|||
|
'/usr/lib64/python2.7/plat-linux2',
|
|||
|
'/usr/lib64/python2.7/lib-tk',
|
|||
|
'/usr/lib64/python2.7/lib-old',
|
|||
|
'/usr/lib64/python2.7/lib-dynload',
|
|||
|
'/usr/lib64/python2.7/site-packages',
|
|||
|
'/usr/lib64/python2.7/site-packages/gtk-2.0',
|
|||
|
'/usr/lib/python2.7/site-packages']
|
|||
|
```
|
|||
|
|
|||
|
如果仅仅想获得数据而不是输出数据也可以用pformat
|
|||
|
|
|||
|
```python
|
|||
|
import sys
|
|||
|
import pprint
|
|||
|
|
|||
|
str = pprint.pformat(sys.path)
|
|||
|
print(str)
|
|||
|
运行结果同上
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
|
|||
|
## 四、元组
|
|||
|
|
|||
|
**导语**
|
|||
|
元组介绍
|
|||
|
访问元组
|
|||
|
修改元组
|
|||
|
删除元组
|
|||
|
元组运算符
|
|||
|
元组索引、截取
|
|||
|
无关闭分隔符
|
|||
|
元组内置函数
|
|||
|
|
|||
|
**元组介绍**
|
|||
|
**使用元组的理由**
|
|||
|
|
|||
|
```ini
|
|||
|
1. 占用内存空间小
|
|||
|
2. 元组内的值不会被意外的修改
|
|||
|
3. 可作为字典的键
|
|||
|
4. 函数的参数是以元组形式传递的
|
|||
|
5. 命名元组有时候可以代替类的对象(面向对象的时候讲)
|
|||
|
```
|
|||
|
|
|||
|
与列表类似,不同之处在于元组的元素不能修改。
|
|||
|
元组使用小括号,列表使用方括号。
|
|||
|
元组的创建,只需要在括号中添加元素,并使用逗号隔开即可。
|
|||
|
|
|||
|
实例
|
|||
|
|
|||
|
```python
|
|||
|
tup1 = ('physics', 'chemistry', 1997, 2000)
|
|||
|
tup2 = (1, 2, 3, 4, 5 )
|
|||
|
tup3 = "a", "b", "c", "d" # 任意无符号的对象,以逗号隔开,默认为元组
|
|||
|
var1,var2,var3,var4=tup3 # 元组解包(unpack),把元组中的元素分别赋值给前面的变量
|
|||
|
```
|
|||
|
|
|||
|
**创建空元组**
|
|||
|
|
|||
|
```python
|
|||
|
tup1 = ()
|
|||
|
|
|||
|
元组中只包含一个元素时,需要在元素后面添加逗号,不加逗号会怎样,用type看一下类型
|
|||
|
tup1 = (50,)
|
|||
|
```
|
|||
|
|
|||
|
**访问元组**
|
|||
|
元组与字符串类似,下标索引从0开始,可以进行截取,组合等
|
|||
|
元组可以使用下标索引来访问元组中的值
|
|||
|
实例:
|
|||
|
|
|||
|
```python
|
|||
|
#!/usr/bin/python3.8
|
|||
|
tup1 = ('physics', 'chemistry', 1997, 2000);
|
|||
|
tup2 = (1, 2, 3, 4, 5, 6, 7 );
|
|||
|
print("tup1[0]: ", tup1[0])
|
|||
|
print("tup2[1:5]: ", tup2[1:5])
|
|||
|
|
|||
|
输出结果:
|
|||
|
tup1[0]: physics
|
|||
|
tup2[1:5]: (2, 3, 4, 5)
|
|||
|
```
|
|||
|
|
|||
|
**修改元组**
|
|||
|
元组中的元素值不允许修改,但可以对元组进行连接组合
|
|||
|
实例:
|
|||
|
|
|||
|
```python
|
|||
|
#!/usr/bin/python3.8
|
|||
|
tup1 = (12, 34.56)
|
|||
|
tup2 = ('abc', 'xyz')
|
|||
|
# 以下修改元组元素操作是非法的。
|
|||
|
# tup1[0] = 100;
|
|||
|
|
|||
|
# 创建一个新的元组
|
|||
|
tup3 = tup1 + tup2
|
|||
|
print(tup3)
|
|||
|
|
|||
|
输出结果:
|
|||
|
(12, 34.56, 'abc', 'xyz')
|
|||
|
```
|
|||
|
|
|||
|
**删除元组**
|
|||
|
元组中的元素值是不允许删除的,但可使用del语句删除整个元组
|
|||
|
实例:
|
|||
|
|
|||
|
```python
|
|||
|
#!/usr/bin/python3.8
|
|||
|
tup = ('physics', 'chemistry', 1997, 2000)
|
|||
|
print (tup)
|
|||
|
del tup
|
|||
|
print ("After deleting tup : ")
|
|||
|
print (tup)
|
|||
|
|
|||
|
# 以上实例元组被删除后,输出变量会有异常信息
|
|||
|
输出结果:
|
|||
|
('physics', 'chemistry', 1997, 2000)
|
|||
|
After deleting tup :
|
|||
|
Traceback (most recent call last):
|
|||
|
File "test.py", line 9, in <module>
|
|||
|
print tup;
|
|||
|
NameError: name 'tup' is not defined
|
|||
|
```
|
|||
|
|
|||
|
**元组解包**
|
|||
|
|
|||
|
```python
|
|||
|
In [199]: one,two = 1,2
|
|||
|
In [200]: one,two = two,one
|
|||
|
|
|||
|
In [201]: one
|
|||
|
Out[201]: 2
|
|||
|
|
|||
|
In [202]: two
|
|||
|
Out[202]: 1
|
|||
|
```
|
|||
|
|
|||
|
## 五、字典
|
|||
|
|
|||
|
字典是**映射类型数据结构**,且可存储任意类型对象,是除列表以外python之中最灵活的内置数据结构类型。查找速度非常快,一个元素和10W个元素没有什么区别
|
|||
|
|
|||
|
• 在字典存放的每个元素都是以一对儿键值对。
|
|||
|
• 在 Python 中字典通常被称为dict,键称为 key,值称为 value
|
|||
|
• 字典中不可以存在相同的 key,但是 value 可以。
|
|||
|
|
|||
|
**字典创建**
|
|||
|
字典当中的元素是通过键来存取的,每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中。
|
|||
|
格式:d = {key1 : value1, key2 : value2 }
|
|||
|
|
|||
|
```python
|
|||
|
dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
|
|||
|
dict1 = { 'abc': 456 }
|
|||
|
dict2 = { 'abc': 123, 98.6: 37 }
|
|||
|
dict3 = {} # 空字典
|
|||
|
```
|
|||
|
|
|||
|
**copy()创建字典**
|
|||
|
|
|||
|
```python
|
|||
|
a={"a":"b","aa":"bb"}
|
|||
|
b=a.copy()
|
|||
|
a=
|
|||
|
```
|
|||
|
|
|||
|
**fromkeys()创建字典**
|
|||
|
语法
|
|||
|
dict.fromkeys(seq[, value])
|
|||
|
seq -- 字典键值列表
|
|||
|
value -- 可选参数, 设置键序列(seq)的值
|
|||
|
|
|||
|
以**序列** seq 中元素做字典的键,序列可以是字符串、列表、元组。value 为字典所有键对应的初始值。
|
|||
|
|
|||
|
实例
|
|||
|
|
|||
|
```python
|
|||
|
#!/usr/bin/python3.8
|
|||
|
seq = ('Google', 'Runoob', 'Taobao')
|
|||
|
dict = dict.fromkeys(seq)
|
|||
|
# dict = {}.fromkeys(seq) 也可以把dict写成{}
|
|||
|
print ("新字典为 : %s" % str(dict))
|
|||
|
|
|||
|
dict = dict.fromkeys(seq, 10)
|
|||
|
print ("新字典为 : %s" % str(dict))
|
|||
|
|
|||
|
输出结果:
|
|||
|
新字典为 : {'Google': None, 'Taobao': None, 'Runoob': None}
|
|||
|
新字典为 : {'Google': 10, 'Taobao': 10, 'Runoob': 10}
|
|||
|
```
|
|||
|
|
|||
|
**dict()创建字典**
|
|||
|
dict() 接收一个序列类型的参数,这个序列类型中的每个元素必须是成对出现
|
|||
|
|
|||
|
```python
|
|||
|
>>>dict() # 创建空字典
|
|||
|
{}
|
|||
|
>>> dict(a='a', b='b', t='t') # 传入关键字
|
|||
|
{'a': 'a', 'b': 'b', 't': 't'}
|
|||
|
|
|||
|
>>> dict([('one', 1), ('two', 2), ('three', 3)]) # 可迭代对象方式来构造字典
|
|||
|
{'three': 3, 'two': 2, 'one': 1} # 字典的无序特性:列表是有序的对象结合,字典是无序的对象集合
|
|||
|
```
|
|||
|
|
|||
|
**zip()创建字典**
|
|||
|
利用 zip() 函数**可以对具有相同数量的元素的序列进行配对**,返回的值不是元组,也不是列表,而是一个整合在一起的可迭代变量
|
|||
|
|
|||
|
```python
|
|||
|
In [36]: english = 'Monday','Tuesday','Thursday',
|
|||
|
In [37]: chineses = '星期一','星期二','星期三'
|
|||
|
|
|||
|
In [38]: zip(english,chineses)
|
|||
|
Out[38]: <zip at 0x1052c7f08>
|
|||
|
|
|||
|
In [39]: type(zip(english,chineses))
|
|||
|
Out[39]: zip
|
|||
|
|
|||
|
In [27]: for key,value in zip(english,chineses):
|
|||
|
...: print(key,value)
|
|||
|
Monday 星期一
|
|||
|
Tuesday 星期二
|
|||
|
Thursday 星期三
|
|||
|
|
|||
|
In [41]: list((english,chineses)) #转换成列表,这个的结果不能直接用dict转换
|
|||
|
Out[41]: [('Monday', 'Tuesday', 'Thursday'), ('星期一', '星期二', '星期三')]
|
|||
|
|
|||
|
In [40]: dict(zip(english,chineses)) # 映射函数方式来构造字典
|
|||
|
Out[40]: {'Monday': '星期一', 'Thursday': '星期三', 'Tuesday': '星期二'}
|
|||
|
|
|||
|
>>> dict(zip(['one', 'two', 'three'], [1, 2, 3])) # 映射函数方式来构造字典
|
|||
|
{'three': 3, 'two': 2, 'one': 1}
|
|||
|
|
|||
|
==注意:zip() 函数会在最短序列迭代(循环)完毕时停止==
|
|||
|
```
|
|||
|
|
|||
|
**key的唯一性和不可变性**
|
|||
|
**键** 必须是唯一且**不可变**的,如果同一个键被赋值两次,后一个值会被记住,**值** 则可以取**任何**数据类型
|
|||
|
|
|||
|
下面的字典最后长什么样子?
|
|||
|
|
|||
|
```python
|
|||
|
# python认为:True==1==1.0
|
|||
|
d= {True:'yes',1:'no',1.0:'maybe'}
|
|||
|
print(d)
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
Python字典中的键 是否相同(只有相同才会覆盖)取决于两个条件:
|
|||
|
|
|||
|
```python
|
|||
|
1、两者的值是否相等(比较__eq__()方法)
|
|||
|
2、比较两者的哈希值是否相同(比较___hash__()hash方法)
|
|||
|
In [69]: (hash(True), hash(1), hash(1.0))
|
|||
|
(1, 1, 1)
|
|||
|
```
|
|||
|
|
|||
|
Python 内部用一个哈希表来维护字典中的 key 到 value 的映射关系
|
|||
|
所以 key **必须是可哈希的**:
|
|||
|
判断一个对象是否可哈希用hash()函数,返回一个整数,就是可哈希,反之会抛出 TypeError 异常
|
|||
|
|
|||
|
**python中可变数据类型有:**
|
|||
|
list
|
|||
|
dict
|
|||
|
set
|
|||
|
|
|||
|
**python不可变数据类型:**
|
|||
|
布尔型
|
|||
|
整型
|
|||
|
浮点型
|
|||
|
元组
|
|||
|
字符串
|
|||
|
|
|||
|
例如
|
|||
|
|
|||
|
```python
|
|||
|
In [10]: li = [1,2,3,4] # 列表为可变类型
|
|||
|
|
|||
|
In [11]: dic = {'name':'wing','age':28,li:8}
|
|||
|
---------------------------------------------------------------------------
|
|||
|
TypeError Traceback (most recent call last)
|
|||
|
<ipython-input-11-adb0f90c4fca> in <module>()
|
|||
|
----> 1 dic = {'name':'wing','age':28,li:gender}
|
|||
|
|
|||
|
TypeError: unhashable type: 'list'
|
|||
|
```
|
|||
|
|
|||
|
**获取字典所有的 key**
|
|||
|
dict_obj.keys()
|
|||
|
|
|||
|
```python
|
|||
|
dic01={'a':1,'b':2}
|
|||
|
print(dic01.keys())
|
|||
|
```
|
|||
|
|
|||
|
**访问字典里的值**有三种方式:
|
|||
|
dict_obj['key'] # key 必须存在,不存在,抛出异常
|
|||
|
|
|||
|
dict_obj.get('key') # key 存在获取到 value,不存在,返回 None
|
|||
|
|
|||
|
dict_obj.get('key', 'value') # key 不存在,返回指定的 value
|
|||
|
|
|||
|
```python
|
|||
|
#!/usr/bin/python3.8
|
|||
|
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
|
|||
|
print ("dict['Name']: ", dict['Name'])
|
|||
|
print ("dict['Age']: ", dict['Age'])
|
|||
|
输出结果:
|
|||
|
dict['Name']: Zara
|
|||
|
dict['Age']: 7
|
|||
|
```
|
|||
|
|
|||
|
**获取字典所有的 value**
|
|||
|
dict_obj.values()
|
|||
|
|
|||
|
**一次性获取字典的 key 和 value**
|
|||
|
dict_obj.items()
|
|||
|
|
|||
|
**两种遍历字典方法:**
|
|||
|
第一种:
|
|||
|
|
|||
|
```python
|
|||
|
for k,v in dict.items():
|
|||
|
print(k,v)
|
|||
|
```
|
|||
|
|
|||
|
第二种:高效
|
|||
|
|
|||
|
```python
|
|||
|
for key in dict:
|
|||
|
print(key,dict[key])
|
|||
|
```
|
|||
|
|
|||
|
**修改字典**
|
|||
|
向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对
|
|||
|
|
|||
|
```python
|
|||
|
#!/usr/bin/python3.8
|
|||
|
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
|
|||
|
dict['Age'] = 8 # update existing entry
|
|||
|
dict['School'] = "DPS School" # Add new entry
|
|||
|
print ("dict['Age']: ", dict['Age'])
|
|||
|
print("dict['School']: ", dict['School'])
|
|||
|
|
|||
|
输出结果:
|
|||
|
dict['Age']: 8
|
|||
|
dict['School']: DPS School
|
|||
|
```
|
|||
|
|
|||
|
**删除字典元素**:
|
|||
|
|
|||
|
```python
|
|||
|
del dict['Name'] # 删除键是'Name'的条目
|
|||
|
dict.clear() # 清空字典所有条目
|
|||
|
del dict # 删除字典
|
|||
|
```
|
|||
|
|
|||
|
**pop()**
|
|||
|
截取字典key的value,源字典key会被删除
|
|||
|
|
|||
|
```python
|
|||
|
In [361]: dic6 = {'b': 2, 'c': '3', 'd': 'new key', 'li': [1, 3, 5]}
|
|||
|
In [362]: dic6
|
|||
|
Out[362]: {'b': 2, 'c': '3', 'd': 'new key', 'li': [1, 3, 5]}
|
|||
|
|
|||
|
In [363]: li = dic6.pop('li')
|
|||
|
|
|||
|
In [364]: li # 劫取出来的value
|
|||
|
Out[364]: [1, 3, 5]
|
|||
|
|
|||
|
In [365]: dic6
|
|||
|
Out[365]: {'b': 2, 'c': '3', 'd': 'new key'}
|
|||
|
```
|
|||
|
|
|||
|
**字典相关内置函数**
|
|||
|
dict.setdefault(key, default=None)
|
|||
|
和get()类似, 但如果key在字典中不存在,将会添加键并将值设为default,不管添加成功与否,都返回该key对应的value
|
|||
|
也是给字典添加元素的一种方式
|
|||
|
|
|||
|
```python
|
|||
|
In [85]: f
|
|||
|
Out[85]: {1: '农夫山泉', 2: '矿泉水', 3: '可乐'}
|
|||
|
|
|||
|
In [83]: f.setdefault(8,"雪碧")
|
|||
|
Out[83]: '雪碧'
|
|||
|
```
|
|||
|
|
|||
|
dict.update(dict2)
|
|||
|
把字典dict2的键/值对更新到dict里
|
|||
|
|
|||
|
**字典变量解包**
|
|||
|
|
|||
|
```python
|
|||
|
>>> d3,d4 = {'x':32,'y':80}
|
|||
|
>>> print(d3)
|
|||
|
x
|
|||
|
>>> print(d4)
|
|||
|
y
|
|||
|
```
|
|||
|
|
|||
|
**应用场景**
|
|||
|
|
|||
|
```python
|
|||
|
host_info = []
|
|||
|
|
|||
|
host_info.append(
|
|||
|
{'192.168.1.11':
|
|||
|
{'cpu':['Intel(R) Core(TM) i5-5350U CPU @ 1.80GHz',4,1],
|
|||
|
'memory':['16','4','2'],
|
|||
|
'disk':['1T','2T']
|
|||
|
}
|
|||
|
}
|
|||
|
)
|
|||
|
|
|||
|
jso
|
|||
|
host_info.append({'192.168.1.12':
|
|||
|
{'cpu':['Intel(R) Core(TM) i5-5350U CPU @ 1.80GHz',4,1],'memory':['16','4','2'],'disk':['1T','2T']}})
|
|||
|
|
|||
|
|
|||
|
host_info[0]["192.168.1.11"]['disk'][0]
|
|||
|
```
|
|||
|
|
|||
|
## 六、集合
|
|||
|
|
|||
|
集合就是数学里的集合,没有什么特殊的定义。集合最好的应用是去重。
|
|||
|
表示方法是通过一个{}创建或者通过set和frozenset函数转换成集合。
|
|||
|
|
|||
|
**有两个函数可创建集合类型对象**
|
|||
|
|
|||
|
```python
|
|||
|
set() # 创建可变集合对象
|
|||
|
frozenset() # 创建不可变集合对象
|
|||
|
```
|
|||
|
|
|||
|
**可变集合创建**
|
|||
|
|
|||
|
```python
|
|||
|
s = {"tom","cat","name","error"}
|
|||
|
# 或
|
|||
|
s = set({"tom","cat","name","error"})
|
|||
|
```
|
|||
|
|
|||
|
**不可变集合创建**:
|
|||
|
|
|||
|
```python
|
|||
|
>>> s = [23,3,4,32]
|
|||
|
>>> d = frozenset(s) # 创建不可变集合d
|
|||
|
>>> print(d)
|
|||
|
frozenset({23,3,4,32})
|
|||
|
```
|
|||
|
|
|||
|
**集合特性**
|
|||
|
|
|||
|
集合是一组无序可哈希(hash)的值,所有元素不会重复
|
|||
|
支持成员关系测试:in , not in
|
|||
|
支持迭代,集合中的元素必须是可迭代对象
|
|||
|
不支持:索引、元素获取、切片
|
|||
|
没有特定语法格式,只能通过工厂函数set或者frozenset创建,字符串则直接创建即可
|
|||
|
|
|||
|
注:可哈希是什么意思
|
|||
|
hash是一种函数映射,称为hash函数,y=hash_func(x),可hash就是指对于一个对象x有其对应的y。在python内部是通过字典key的hash值来对应内存中的value地址的,所以两个相同hash的key就表示同一个了,而不可hash的对象自然也不能作为字典的key。
|
|||
|
|
|||
|
**集合运算符**:
|
|||
|
s | t s和t的并集
|
|||
|
s & t s和t的交集
|
|||
|
s - t 求差集
|
|||
|
s ^ t 求对称差集
|
|||
|
|
|||
|
**适用于set可变集合常用方法**:
|
|||
|
s.add(item) 将item添加到s中。如果item已经在s中,则无任何效果
|
|||
|
s.remove(item) 从s中删除item。如果item不是s的成员,则引发KeyError异常
|
|||
|
s.discard(item) 从s中删除item。如果item不是s的成员,则无任何效果
|
|||
|
s.pop() 随机删除一个s中任意的集合元素,如果有变量接收则会接收到删除到的那个元素
|
|||
|
s.clear() 删除s中的所有元素
|
|||
|
s.copy() 浅复制
|
|||
|
s.update(t) 将t中的所有元素添加到s中。t可以是另一个集合、一个序列或者支持迭代的任意对象
|
|||
|
s.union(t) 并集。返回所有在s和t中的元素
|
|||
|
s.intersection(t) 交集。返回所有同时在s和t中的都有的元素
|
|||
|
s.intersection_update(t) 算s与t的交集,并将结果赋值给s
|
|||
|
s.difference(t) 差集。返回所有在set中,但不在t中的元素
|
|||
|
s.difference_update(t) 从s中删除同时也在t中的所有元素
|
|||
|
s.symmetric_difference(t) 求对称差集。返回所有s中没有t中的元素和t中没有s中的元素组成的集合
|
|||
|
s.sysmmetric_difference_update(t) 计算s与t的对称差集,并将结果放入s
|
|||
|
s.isdisjoint(t) 如果s和t没有相同项,则返回True
|
|||
|
s.issubset(t) 如果s是t的一个子集,则返回True
|
|||
|
s.issuperset(t) 如果s是t的一个超集,则返回True
|
|||
|
|
|||
|
**集合实例:祛除列表中重复的元素**
|
|||
|
例1:去除海量列表里重复元素
|
|||
|
|
|||
|
```python
|
|||
|
>>> a = [11,22,33,44,11,22]
|
|||
|
>>> b = set(a)
|
|||
|
>>> b
|
|||
|
set([33, 11, 44, 22])
|
|||
|
```
|
|||
|
|
|||
|
例2:去除重复元素后转换成列表
|
|||
|
|
|||
|
```python
|
|||
|
l1 = ['b','c','d','b','c','a','a']
|
|||
|
l2 = list(set(l1))
|
|||
|
print(l2)
|
|||
|
```
|
|||
|
|
|||
|
还有一种
|
|||
|
|
|||
|
```python
|
|||
|
l1 = ['b','c','d','b','c','a','a']
|
|||
|
l2 = {}.fromkeys(l1).keys()
|
|||
|
l3=[]
|
|||
|
for i in l2:
|
|||
|
l3.append(i)
|
|||
|
print(l3)
|
|||
|
```
|
|||
|
|
|||
|
这两种都有个缺点,祛除重复元素后排序变了:
|
|||
|
['a', 'c', 'b', 'd']
|
|||
|
|
|||
|
如果想要保持他们原来的排序:用list类的sort方法
|
|||
|
|
|||
|
```python
|
|||
|
l1 = ['b','c','d','b','c','a','a']
|
|||
|
l2 = list(set(l1))
|
|||
|
l2.sort(key=l1.index)
|
|||
|
print(l2)
|
|||
|
```
|
|||
|
|
|||
|
也可以这样写:
|
|||
|
|
|||
|
```python
|
|||
|
l1 = ['b','c','d','b','c','a','a']
|
|||
|
l2 = sorted(set(l1),key=l1.index)
|
|||
|
print(l2)
|
|||
|
```
|
|||
|
|
|||
|
也可以用遍历:
|
|||
|
|
|||
|
```python
|
|||
|
l1 = ['b','c','d','b','c','a','a']
|
|||
|
l2 = []
|
|||
|
for i in l1:
|
|||
|
if not i in l2:
|
|||
|
l2.append(i)
|
|||
|
print(l2)
|
|||
|
```
|
|||
|
|
|||
|
上面的代码也可以这样写
|
|||
|
|
|||
|
```python
|
|||
|
l1 = ['b','c','d','b','c','a','a']
|
|||
|
l2 = []
|
|||
|
[l2.append(i) for i in l1 if not i in l2] # 列表推导式
|
|||
|
print l2
|
|||
|
```
|
|||
|
|
|||
|
这样就可以保证排序不变了
|
|||
|
['b', 'c', 'd', 'a']
|
|||
|
|
|||
|
**None类型**
|
|||
|
|
|||
|
```python
|
|||
|
In [66]: a=None
|
|||
|
In [67]: type(None)
|
|||
|
NoneType
|
|||
|
```
|
|||
|
|
|||
|
## 七、内建函数
|
|||
|
|
|||
|
查看系统内所有内置函数(BIF):isinstance就在里面
|
|||
|
|
|||
|
```python
|
|||
|
>>> dir(__builtins__)
|
|||
|
```
|
|||
|
|
|||
|
**长度、最大最小值**
|
|||
|
|
|||
|
支持字符串、列表、元组、字典、集合,不支持数字
|
|||
|
|
|||
|
```python
|
|||
|
len(str)
|
|||
|
字符串长度
|
|||
|
In [11]: a='hello world'
|
|||
|
In [15]: len(a)
|
|||
|
Out[15]: 11
|
|||
|
```
|
|||
|
|
|||
|
```python
|
|||
|
max(str)
|
|||
|
返回字符串 str 中最大的字母。
|
|||
|
|
|||
|
In [42]: max(a)
|
|||
|
Out[42]: 'w'
|
|||
|
|
|||
|
min(str)
|
|||
|
返回字符串 str 中最小的字母。
|
|||
|
|
|||
|
In [45]: min(a)
|
|||
|
Out[45]: ' '
|
|||
|
```
|
|||
|
|
|||
|
**类型转换**
|
|||
|
|
|||
|
数据类型的转换,你只需要将数据类型作为函数名即可。
|
|||
|
以下几个内置的函数可以执行数据类型之间的转换。这些函数返回一个新的对象,表示转换的值。
|
|||
|
|
|||
|
| 函数 | 意义 |
|
|||
|
| ------------ | ------------------------------------------------------------ |
|
|||
|
| float(x) | print(float('10')) 将x转换到一个浮点数 |
|
|||
|
| **str(x)** | print(str(10)) 将x转换为字符串 |
|
|||
|
| repr(x) | print(type(repr(10))) 将对象 x 转换为表达式字符串 |
|
|||
|
| eval(str) | print(eval('5+8')) 用来计算在字符串中的有效Python表达式,并返回一个对象 |
|
|||
|
| **tuple(s)** | 将序列 s 转换为一个元组 |
|
|||
|
| **list(s)** | 将序列 s 转换为一个列表 |
|
|||
|
| **set(s)** | 转换为可变集合 |
|
|||
|
| **dict(d)** | 创建一个字典。d 必须是一个序列 (key,value)元组。成对出现的数据,比如a=8,b=9 |
|
|||
|
| frozenset(s) | 转换为不可变集合 |
|
|||
|
| **int(d)** | 转换为整型 |
|
|||
|
| chr(x) | asc=chr(97);print(asc) 将一个整数转换为一个字符,ascii与字符的转换函数 |
|
|||
|
| ord(x) | asc=ord('a');print(asc) 将一个字符转换为它的整数值,与chr()相反 |
|
|||
|
| hex(x) | asc=hex(10);print(asc) 将一个整数转换为一个十六进制字符串 |
|
|||
|
| oct(x) | asc=oct(10);print(asc) 将一个整数转换为一个八进制字符串 |
|
|||
|
|
|||
|
**常用的几个**
|
|||
|
int
|
|||
|
list
|
|||
|
tuple
|
|||
|
str
|
|||
|
dict
|
|||
|
|
|||
|
**str与repr的区别**
|
|||
|
|
|||
|
str()一般是将数值转成字符串(返回一个字符串,包含对象的友好的可打印表示形式。对于字符串,它返回字符串本身)。
|
|||
|
|
|||
|
'' 输出本身内容
|
|||
|
|
|||
|
repr()是将一个对象转成字符串显示。
|
|||
|
|
|||
|
实质上''与repr()意义是相同的。
|
|||
|
|
|||
|
**eval函数类型转换**
|
|||
|
|
|||
|
功能:将字符串str当成有效的表达式来求值并返回计算结果。
|
|||
|
|
|||
|
语法: eval(source[, globals[, locals]]) -> value
|
|||
|
|
|||
|
参数:
|
|||
|
|
|||
|
source:一个Python表达式或函数compile()返回的代码对象
|
|||
|
|
|||
|
globals:可选。必须是dictionary
|
|||
|
|
|||
|
locals:可选。任意map对象
|
|||
|
|
|||
|
```python
|
|||
|
1 可以把list,tuple,dict和string相互转化。
|
|||
|
2 #################################################
|
|||
|
3 字符串转换成列表
|
|||
|
4 >>>a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
|
|||
|
5 >>>type(a)
|
|||
|
6 <type 'str'>
|
|||
|
7 >>> b = eval(a)
|
|||
|
8 >>> print b
|
|||
|
9 [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
|
|||
|
10 >>> type(b)
|
|||
|
11 <type 'list'>
|
|||
|
12 #################################################
|
|||
|
13 字符串转换成字典
|
|||
|
14 >>> a = "{1: 'a', 2: 'b'}"
|
|||
|
15 >>> type(a)
|
|||
|
16 <type 'str'>
|
|||
|
17 >>> b = eval(a)
|
|||
|
18 >>> print b
|
|||
|
19 {1: 'a', 2: 'b'}
|
|||
|
20 >>> type(b)
|
|||
|
21 <type 'dict'>
|
|||
|
22 #################################################
|
|||
|
23 字符串转换成元组
|
|||
|
24 >>> a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
|
|||
|
25 >>> type(a)
|
|||
|
26 <type 'str'>
|
|||
|
27 >>> b = eval(a)
|
|||
|
28 >>> print b
|
|||
|
29 ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))
|
|||
|
30 >>> type(b)
|
|||
|
31 <type 'tuple'>
|
|||
|
```
|
|||
|
|
|||
|
## 八、推导式
|
|||
|
|
|||
|
推导式是 Python 语言中独有的特性,它是从一个或者多个迭代器快速简洁地创建数据结构的一种方法,可以将循环和条件判断相结合,从而避免语法冗长的代码
|
|||
|
|
|||
|
**列表推导式**
|
|||
|
|
|||
|
list comprehension -- 列表推导式,处理一个序列中的所有或部分元素并返回结果列表的一种紧凑写法。
|
|||
|
|
|||
|
```python
|
|||
|
# 语法格式
|
|||
|
[expression for item in iterable ]
|
|||
|
expression # 表达式,比如 单独的变量名,变量名 - 1
|
|||
|
item # 循环变量
|
|||
|
iterable # 可迭代对象 其后面可以跟判断条件,如:
|
|||
|
[expression for item in iterable if condition]
|
|||
|
```
|
|||
|
|
|||
|
```python
|
|||
|
# 传统方法
|
|||
|
In [1]: number_list = list(range(1,5))
|
|||
|
|
|||
|
In [2]: number_list
|
|||
|
Out[2]: [1, 2, 3, 4]
|
|||
|
|
|||
|
# 列表推导式
|
|||
|
In [3]: num_list = [n for n in range(1,7)]
|
|||
|
|
|||
|
In [4]: num_list
|
|||
|
Out[4]: [1, 2, 3, 4, 5, 6]
|
|||
|
```
|
|||
|
|
|||
|
```python
|
|||
|
[i for i in 1,2,3,4] # 报错
|
|||
|
[i for i in (1,2,3,4)] # 正确
|
|||
|
```
|
|||
|
|
|||
|
```python
|
|||
|
# 添加有表达式的列表推导式
|
|||
|
In [5]: num_list = [n - 1 for n in range(1,7)]
|
|||
|
|
|||
|
In [6]: num_list
|
|||
|
Out[6]: [0, 1, 2, 3, 4, 5]
|
|||
|
```
|
|||
|
|
|||
|
```python
|
|||
|
# 有条件判断的传统方法
|
|||
|
In [7]: a_list = []
|
|||
|
|
|||
|
In [8]: for n in range(1,6):
|
|||
|
...: if n % 2 == 1:
|
|||
|
...: a_list.append(n)
|
|||
|
...:
|
|||
|
|
|||
|
In [9]: a_list
|
|||
|
Out[9]: [1, 3, 5]
|
|||
|
|
|||
|
# 有条件判断的列表推导式
|
|||
|
In [10]: a_list = [n for n in range(1,6) if n % 2 == 1]
|
|||
|
|
|||
|
In [11]: a_list
|
|||
|
Out[11]: [1, 3, 5]
|
|||
|
```
|
|||
|
|
|||
|
```python
|
|||
|
# 含有嵌套循环的一般方法
|
|||
|
In [12]: rows = range(1,4)
|
|||
|
|
|||
|
In [13]: cols = range(1,3)
|
|||
|
|
|||
|
In [14]: for row in rows:
|
|||
|
...: for col in cols:
|
|||
|
...: print(row,col)
|
|||
|
...:
|
|||
|
1 1
|
|||
|
1 2
|
|||
|
2 1
|
|||
|
2 2
|
|||
|
3 1
|
|||
|
3 2
|
|||
|
|
|||
|
# 含有嵌套循环的列表推导式
|
|||
|
In [15]: rows = range(1,4)
|
|||
|
|
|||
|
In [16]: cols = range(1,3)
|
|||
|
|
|||
|
In [17]: cells = [(row,col) for row in rows for col in cols]
|
|||
|
|
|||
|
In [18]: for cell in cells:
|
|||
|
...: print(cell)
|
|||
|
...:
|
|||
|
(1, 1)
|
|||
|
(1, 2)
|
|||
|
(2, 1)
|
|||
|
(2, 2)
|
|||
|
(3, 1)
|
|||
|
(3, 2)
|
|||
|
```
|
|||
|
|
|||
|
**字典推导式**
|
|||
|
|
|||
|
```python
|
|||
|
{key_expression:value_expression for expression in iterable}
|
|||
|
```
|
|||
|
|
|||
|
```python
|
|||
|
# 一个简单的例子
|
|||
|
words = 'letters'
|
|||
|
w_counts = {w: words.count(w) for w in words}
|
|||
|
print(w_counts)
|
|||
|
```
|
|||
|
|
|||
|
```python
|
|||
|
# 利用 set 集合去重,以减少 words.count(letter) 的次数,以节约资源和时间
|
|||
|
w_counts = {w: words.count(w) for w in set(words)}
|
|||
|
```
|
|||
|
|
|||
|
**集合推导式**
|
|||
|
格式和列表、字典推导式的格式一样
|
|||
|
|
|||
|
```python
|
|||
|
>>> a_set = {n for n in range(1,6) if n % 3 == 1}
|
|||
|
>>> a_set
|
|||
|
{1, 4}
|
|||
|
```
|
|||
|
|
|||
|
**生成器推导式**
|
|||
|
也许机智的你已经发现了以上的规律,如果将列表推导式的方括号变成圆括号就可以定义一个元组推导式;
|
|||
|
不幸的是,元组没有推导式,其实它是一个生成器推导式,它返回的是一个生成器对象,可以直接对其进行迭代。
|
|||
|
|
|||
|
**特点:**
|
|||
|
|
|||
|
一个生成器只能运行一次。list/set/str/dict 都是存储在内存里的,但生成器仅在运行时产生值,不会被保存下来,当然也不能对其备份。
|
|||
|
|
|||
|
```python
|
|||
|
>>> number_thing = (number for number in range(1,6) if number % 2 == 1)
|
|||
|
|
|||
|
>>> number_thing
|
|||
|
<generator object <genexpr> at 0x7f25d59f1820>
|
|||
|
>>> type(number_thing)
|
|||
|
<type 'generator'>
|
|||
|
|
|||
|
# 可以直接对生成器对象进行迭代
|
|||
|
>>> for number in number_thing:
|
|||
|
... print(number)
|
|||
|
...
|
|||
|
1
|
|||
|
3
|
|||
|
5
|
|||
|
|
|||
|
# 可以对其调用 list()函数,但是由于上面已经迭代一次了,由于其是无法保存的,所以再次进行迭代,发现它已经不存在了
|
|||
|
>>> list(number_thing)
|
|||
|
[]
|
|||
|
|
|||
|
# 再次生成
|
|||
|
>>> number_thing = (number for number in range(1,6) if number % 2 == 1)
|
|||
|
>>> list(number_thing)
|
|||
|
[1, 3, 5]
|
|||
|
```
|
|||
|
|
|||
|
|