7. for迴圈、資料型別內建方法
阿新 • • 發佈:2022-03-08
一、 while迴圈補充
1. while+else
當while沒有被關鍵字break主動結束的情況下,正常結束迴圈體程式碼之後會執行else的子程式碼
"""
語法
while 條件:
迴圈體程式碼
else:
迴圈體程式碼正常執行結束,則會執行該子程式碼塊
"""
count = 1
while count < 11:
print(count)
count += 1
else:
print('迴圈全部執行完畢') # while迴圈在條件不滿足時結束,此行程式碼會被執行
# 當while迴圈執行過程中被break中止時,就不會執行else的子程式碼塊
count = 1
while count < 11:
if count == 4:
break # 當count的值為4時,while迴圈結束
print(count)
count += 1
else:
print('while迴圈沒有被中止正常結束') # 此行程式碼不會被執行
2. 死迴圈與while巢狀
死迴圈有些時候會極度影響電腦的效能,甚至會造成硬體的損壞
死迴圈就是永遠無法結束的迴圈並且一直佔用cpu工作
# 尤其是計算類的死迴圈會影響計算機的cpu count = 10 while True: count *= 1
# while巢狀(可使用全域性標誌位進行巢狀)
flag = True # 1.定義初始狀態,布林值為真
while flag: # 2.根據條件判斷結果決定是否執行迴圈;;首次結果為True;;
name = input('請輸入使用者名稱:')
passwd = input('請輸入密碼:')
if name == '梅西' and passwd == '30':
print('登入成功')
while flag: # 3.登入成功後;;條件為真,讓使用者一直輸入指令
cmd = input('請輸入指令: ')
if cmd == 'q': # 4.如果輸入的指令是q,則給flag賦值為False;;下次的內層while迴圈條件為False;;然後if判斷的程式碼塊也執行完畢,將進行下次外層while迴圈,條件也為False,結束
print('退遊')
flag = False
print('正在執行您的指令:%s' % cmd)
else:
print('使用者名稱或密碼錯誤')
二、 for迴圈
1. 概念與語法
迴圈結構的第二種方式是for迴圈,for迴圈可以做的事情while迴圈都可以實現
在迴圈取值(遍歷值)的時候,for迴圈比while迴圈更簡潔
for 變數名 in 可迭代物件:
迴圈體程式碼
可迭代物件包括:字串、列表、元組、字典、集合
每一次迴圈都會將可迭代物件中的一個元素賦值給變數名
2. for迴圈遍歷基本資料型別
# 使用for迴圈遍歷字串
for a in '阿根廷 足球巨星梅西':
print(a) # 注意:空格也是字串,也會被列印
# 使用for迴圈遍歷列表
player = ['梅西', 'C羅', '貝爾', '萊萬', '卡瓦尼']
for name in player:
print(name)
# 使用for迴圈遍歷元組
for b in (11, 22, 33, 44, 55):
print(b)
# 使用for迴圈遍歷字典:遍歷字典只能獲取到到字典的key,value無法直接獲取
info = {'name': '梅西', 'age': 35, 'club': 'psg'}
for c in info:
print(c) # 列印的值為字典的key
print(info[c]) # 可以通過的方式列印字典的value
# 使用for迴圈遍歷集合
for d in {111, 111, 222, 333, 444}:
print(d) # 列印的結果無序,因為集合的特點是無序的;;只打印四個值,因為集合沒有重複元素
3. range函式
概念:range是python的一個內建函式,用於生成一系列連續的整數
range方法在python2和python3中有區別:
python2中range是直接產生一個列表,元素很多的情況下比較佔用空間
python2中的xrange就相當於python3中的range
python中range相當於口袋,不佔空間但是也可以取出很多資料(python3中只有一個range)
range用法
# 用法1:括號內只寫一個數字,預設從0開始,顧頭不顧尾
for a in range(10):
print(a) # 依次列印0~9
# 用法2:括號內寫兩個數字,自定義起始位置,顧頭不顧尾
for b in range(5, 10):
print(b) # 依次列印5~9
# 用法3:括號內寫三個數字,第三個數字為等差數列的公差,預設為1
for c in range(1, 10, 2):
print(c) # 依次列印1 3 5 7 9
range在爬蟲方面的應用
url_demo = 'https://movie.douban.com/top250?start=%s&filter='
for i in range(0, 250, 25): # 生成0~250的10個數,公差為25,因為網址每下一頁比上一頁指定位置的值大25
real_url = url_demo % i # 給連結字串的佔位符傳入值,生成可用的連結
print(real_url)
4. for迴圈應用
4.1 for + break
結束本層for迴圈,與while + break用法一致
for a in range(10):
if a == 4: # 當a的值為4時,for迴圈被break結束,因此只會列印0 1 2 3
break
print(a)
4.2 for + continue
結束本次for迴圈,開始下一次for迴圈;;與while + continue用法一致
for b in range(6):
if b == 4: # 當a的值為4時,結束本次迴圈,直接開始下一次迴圈;;因此列印0 1 2 3 5
continue
print(b)
4.3 for + else
for迴圈正常結束之後執行else子程式碼;;與while + else用法一致
for c in range(3):
print(c)
else:
print('只有當for迴圈沒有被break打斷才會執行')
5. for迴圈的應用之九九乘法表
for i in range(1, 10): # 每進行一次外層for迴圈,從1~9之間取出一個值,這個值作為乘號左邊的數
for j in range(1, i + 1): # 一次外層for迴圈已經拿到乘號左邊的數,因為乘法表每一行所在的行數與該行乘式的個數、以及乘號左邊的數值相等;;所以一個完整內層for迴圈最大值為i,即range(1,i+1)
print('%s*%s=%s' % (i, j, i * j), end=' ') # 一次外層for迴圈的i值是固定的,j的值從1開始取,最大值為i,一行多個乘式不換行(空格列印)
print() # 每進行一次完整的外層for迴圈,即列印完成乘法表的一行,應該換行列印
三、 基本資料型別的內建方法
1. 整型
型別轉換
print(int('111'), type(int('111'))) # 可以將只包含整數的字串轉換成整型
print(int('11.22'), type(int('11.22'))) # 報錯,含有浮點型的字串不能被int函式轉換
print(int('abc'), type(int('abc'))) # 報錯,字串不能被int函式轉換
print(int(222.333), type(int(222.333))) # 浮點型可以被轉換成整型
進位制轉換
# 將十進位制轉換成其它進位制
print(bin(100)) # 0b1100100 二進位制 (0b開頭) bin是binary的縮寫
print(oct(100)) # 0o144 八進位制 (0o開頭) oct是octal的縮寫
print(hex(100)) # 0x64 十六進位制(0x開頭) hex是hexadecima的縮寫
# 其它進位制轉換成十進位制
print(int('0b1100100', 2)) # 這兩行程式碼都是將二進位制轉換成十進位制
print(int(0b1100100))
print(int('0o144', 8)) # 將八進位制轉換成十進位制
print(int(0o144))
print(int('0x64', 16)) # 將十六進位制轉換成十進位制
print(int(0x64))
2. 浮點型
型別轉換
print(float('111.222'), type(float('111.222'))) # 將只包含浮點型的字串轉換成浮點型
print(float(333), type(float(333))) # 將整型轉換成浮點型
3. 字串
型別轉換:七大資料型別都可以轉換成字串
# 整型轉換成字串
print(str(11), type(str(11)))
# 浮點型轉換成字串
print(str(222.333), type(str(222.333)))
# 列表轉換成字串
print(str([1, 2, 3, 4]), type(str([1, 2, 3, 4])))
# 字典轉換成字串
print(str({'name': '梅西'}), type(str({'name': '梅西'})))
# 元組轉換成字串
print(str((555, 666, 777, 888)), type(str((555, 666, 777, 888))))
# 集合轉換成字串
print(str({1, 2, 3, 4}), type(str({1, 2, 3, 4})))
# 布林值轉換成字串
print(str(True), type(str(True)))
# 內建方法
s1 = 'hello world'
# 1.索引取值
print(s1[0]) # 類比於列表的索引取值
# 2.切片操作
print(s1[2:4]) # 類比於range()函式,顧頭不顧尾
# 3.切片的步長
print(s1[2:9:2]) # lowr 第三個值是公差,預設是1,類比於range函式的用法
print(s1[-1]) # 反向取;;取最後一個值
print(s1[-1:-5:-1]) # dlro 第3個引數還可以控制索引的方向;因為取值的順序都是從左往右,所以-1的右邊已經沒有值了
print(s1[-5:-1]) # worl
# 4.統計字串中字元的個數
print(len(s1)) # 11
# 5.成員運算
print('ll' in s1) # 即成員運算子
# 6.移除字串首尾指定的字元(使用頻率較高)
name = ' 梅西 '
print(len(name))
res = name.strip() # 預設移除字串首尾的空格
print(res, len(res))
name1 = '$$$$梅$西$$$$' # 可移除首尾指定的字元,不能移除中間的字元
print(name1.strip('$'))
# username = input('username>>>>:').strip()
# if username == '梅西':
# print('阿根廷球王')
# 7.按照指定的字元切割字串
"""split方法切割完字串之後是一個列表"""
info = '梅西|10|PSG|30'
print(info.split('|')) # ['梅西', '10', 'PSG', '30']
print(info.split('|', maxsplit=2)) # ['梅西', '10', 'PSG|30'] 第二個引數控制切割的次數;;預設從左開始切
print(info.rsplit('|', maxsplit=1)) # ['梅西|10|PSG', '30'] rspilt的作用是從右開始切