第1章 數據類型:
1.1可變or不可變類型(變量值):
變量的三個特點:id/type/value
可變類型:值改變,但id不變,證明就是在改變原值
不可變類型:值改變,id也跟着變了,證明申請了新的內存空間來存新值,根本沒有改變量值
Ø 證明浮點型是不可變類型
x=1.1
print(id(x))
x=1.2
print(id(x))
#4344525016
#4344525136
Ø 證明int是不可變類型:
x=10
print(id(x))
x=11
print(id(x))
#4457767232
#4457767264
Ø 證明列表是可變類型:
h=['a','b','c']
print(id(h))
h[0]='J'#修改列表中的某一個值
print(id(h))
#4498034504
#4498034504
Ø 證明字典是可變類型:
h={'x':1,'y':2}
print(id(h))
h['x']=10
print(id(h))
#4363789224
#4363789224
1.2什麼是數據?
X=10 10就是我們要存儲的數據
1.3爲何數據要分不同的數據類型?
數據是用來表示狀態的,不同的狀態就應該用不同的數據去表示
1.4數據類型:
1.4.1數字(×××,長整型,浮點型,複數)
定義×××方式:
x=int(10)
print(type(x))
定義浮點型方式:
x=float(1.22)
print(type(x))
1.4.2字符串str
作用:名字,性別,國籍,地址等描述信息
定義:在單引號、雙引號、三引號內,由一串字符組成
x=str('jiang')
print(type(x))
str類型可以將任意類型轉成字符串類型:
x=str({'a':1})
print(x,type(x))
name='*egon**'
print(name.strip('*'))取*號中間的部分
print(name.lstrip('*'))取*號左邊的部分
print(name.rstrip('*'))取*號右邊的部分
name='egon'
print(name.lower())#變成小寫
print(name.upper())#變成大寫
name='alex_SB'
print(name.endswith('SB'))
print(name.startswith('alex'))
res='{} {} {}'.format('egon',18,'male')
res='{1} {0} {1}'.format('egon',18,'male')
res='{name} {age} {sex}'.format(sex='male',name='egon',age=18)
#join
tag=' '
print(tag.join(['egon','say','hello','world'])) #可迭代對象必須都是字符串
#replace
name='alex say :i have one tesla,my name is alex'
print(name.replace('alex','SB',1))
#isdigit:可以判斷bytes和unicode類型,是最常用的用於於判斷字符是否爲"數字"的方法
age=input('>>: ')
print(age.isdigit())
求字符串的長度:
j='asd'
print(len(j))
成員運算in和not in :判斷一個子字符換是否存在於一個大字符串中
name='my name is jiang,jiang is man'
print('jiang' in name)
移除字符串左右兩邊的空白:
name=' hello '
res=name.strip(' ')
print(res)
name='***hello***'
res=name.strip('*')
print(res)
切分split:
info='root:x:0:0::/root:/bin/bash'
res=info.split(':')
print(res[0])
練習:
移除name變量對應的值兩邊的空格,並輸出處理結果
name=' aleX'
a=name.strip()
print(a)
判斷name變量對應的值是否以“al”開頭,並輸出結果
name=' aaleX'
if name.startswith(al):
print(name)
else:
print('no')
判斷name變量對應的值是否以“x”結尾,並輸出結果
name=' aaleX'
if name.endswith(name):
print(name)
else:
print('no')
將name變量對應的值中的“1”替換爲“p”,並輸出結果
name=' aleX'
print(name.replace('l','p'))
將name變量對應的值根據“l”分隔,並輸出結果
name=' aleX'
print(name.split('l'))
將name變量對應的值變大寫,然後輸出結果
name=' aleX'
print(name.upper())
將name變量對應的值變小寫,然後輸出結果
name=' aleX'
print(name.lower())
請輸出name變量的值的第2個字符
name=' aleX'
print(name[1])
請輸出name變量對應的值中“e”所在索引的位置
name=' aleX'
print(name.index('e'))
獲取子序列,去掉最後一個字符
name=' aleX'
a=name[:-1]
print(a)
1.4.3列表
作用:多個裝備,多個愛好,多門課程等
定義:[]內可以有多個任意類型的值,逗號分隔
name=['a','b','c']
print(name,type(name))
按照索引取值改值:
name=['a','b','c']
print(name)
name[-1]='A'
print(name[-1])
增加列表的元素:
name=['a','b','c']
name.append('jiang')
print(name)
刪除列表的元素
name=['a','b','c']
del name[0]
print(name)
name.remove('b')
print(name)
切片:
name=['a','b','c']
print(name[0:2])
計算長度(就是計算列表中元素的個數):
name=['a','b','c']
print(len(name))
成員運算in和not in:
name=['a','b','c']
print('jiang' in name)
計算個數:
name=['a','b','c','a']
print(name.count('a'))
查看索引,默認找到第一個就返回找不到則報錯:
name=['a','b','c','a']
print(name.index('a'))
排序:
name=[11,-3,0,99,88]
name.sort()
print(name)
反轉:
name=[11,-3,0,99,88]
name.reverse()
print(name)
name=[11,-3,0,99,88]
res=name[::-1]
print(res)
1.4.4元組
作用:存多個值,對比列表來說,元組不可變(是可以當做字典的key的),主要用來讀
定義:與列表類型比,只不過[]換成()
1.4.5字典
作用:存多個值,key-value存取,取值速度快
定義:key必須是不可變類型,value可以是任意類型
1.4.6集合
作用:去重,關係運算
定義:可變類型是不可hash類型,不可變類型是可hash類型
定義集合:在{}內用逗號隔開
x={1,3,5,6,7,1,1}
print(x)
如何造一個空集合:
x={}
print(type(x))
s=set()
print(type(s))
x={}
print(type(x))
s=set()
print(type(s))
長度計算
s={1,2,2,3}
print(len(s))
成員運算
s={'egon','alex','oldboy'}
print('jiang' in s)
關係運算:
python_stu=['egon','alex','kevin','王大炮','李二丫']
linux_stu=['張鐵蛋','劉銅蛋','趙金蛋','alex','oldboy','kevin']
res=[]
for stu1 in python_stu:
if stu1 in linux_stu:
res.append(stu1)
print(res)
交集
python_stu={'egon','alex','kevin','王大炮','李二丫'}
linux_stu={'張鐵蛋','劉銅蛋','趙金蛋','alex','oldboy','kevin'}
print(python_stu& linux_stu)
print(python_stu.intersection(linux_stu))
合集
print(python_stu | linux_stu)
print(python_stu.union(linux_stu))
差集
print(python_stu - linux_stu)
print(python_stu.difference(linux_stu))
對稱差集
print((python_stu - linux_stu) | (linux_stu - python_stu))
print(python_stu ^ linux_stu)
print(python_stu.symmetric_difference(linux_stu))
==
x={1,2,3}
y={1,3,2}
print(x== y)
父集(>= )
s={1,2,3,4}
y={1,2,3}
print(s>= y)
print(s.issuperset(y))
子集(<=)
s={1,2,3}
y={1,2,3,4}
print(s<= y)
print(s.issubset(y))
1.4.7數據類型的總結:
按存儲空間的佔用從低到高
數字
字符串
集合:無序,即無序存索引相關信息
元組:有序,需要存索引相關信息,不可變
列表:有序,需要存索引相關信息,可變,需要處理數據的增刪改
字典:無序,需要存key與value映射的相關信息,需要處理數據的增刪改
練習
pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
linuxs={'wupeiqi','oldboy','gangdan'}
print(pythons| linuxs)#求出所有報名學生名字集合
print(pythons& linuxs)#求出同時報這兩個課程的集合
print(pythons- linuxs)#求出只報了python的學生
print(pythons^ linuxs)#沒有同事報兩個課程的集合
去重:
1. 有列表l=['a','b',1,'a','a'],列表元素均爲可hash類型,去重,得到新列表,且新列表無需保持列表原來的順序
l=['a','b',1,'a','a']
print(set(l))
2.在上題的基礎上,保存列表原來的順序
l=['a','b',1,'a','a']
ll=[]
for iin l:
if i not in ll:
ll.append(i)
print(ll)
利用集合
l=['a','b',1,'a','a']
ll=[]
s=set()
for iin l:
if i not in s:
s.add(i)
ll.append(i)
print(ll)
3.去除文件中重複的行,肯定要保持文件內容的順序不變
import os
with open('db.txt','r',encoding='utf-8') as read_f,\
open('.db.txt.swap','w',encoding='utf-8') as write_f:
s=set()
for line in read_f:
if line not in s:
s.add(line)
write_f.write(line)
os.remove('db.txt')
os.rename('.db.txt.swap','db.txt')
4.有如下列表,列表元素爲不可hash類型,去重,得到新列表,且新列表一定要保持列表原來的順序
l=[
{'name':'egon','age':18,'sex':'male'},
{'name':'alex','age':73,'sex':'male'},
{'name':'egon','age':20,'sex':'female'},
{'name':'egon','age':18,'sex':'male'},
{'name':'egon','age':18,'sex':'male'},
]
l=[
{'name':'egon','age':18,'sex':'male'},
{'name':'alex','age':73,'sex':'male'},
{'name':'egon','age':20,'sex':'female'},
{'name':'egon','age':18,'sex':'male'},
{'name':'egon','age':18,'sex':'male'},
]
s=set()
ll=[]
for i in l:
val=(i['name'],i['age'],i['sex'])
if val not in s:
s.add(val)
ll.append(i)
print(ll)