1. 程式人生 > 其它 >7. for迴圈、資料型別內建方法

7. for迴圈、資料型別內建方法

一、 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的作用是從右開始切