Python基礎(三)

  • 2019 年 10 月 3 日
  • 筆記

今日主要內容

  • 整型
    • 範圍
    • 進位轉換
  • 字元串
    • 索引
    • 切片
    • 部分方法詳解
  • for循環

一、整型(int)

(一)整型的範圍

  • 32位:-2 ** 31 ~ 2 ** 31 -1
  • 64位:-2 ** 63 ~ 2 ** 63 -1

(二)進位轉換

  1. 十進位轉換二進位:

    • 短除法:與2短除,除到商為0,從下向上取余

    • bin() 函數:將十進位數轉換為二進位數

      num = 13  print(bin(num))  # 1101
  2. 二進位轉換十進位

    • 算術法:從右向左依次乘2的n次方(n為0,1,2,…),最後相加

    • int() 函數:其中第二個參數傳入幾進位數,第一個參數傳入對應進位數

      num = "1101"  print(int(num, 2))  # 13

(三)不可變數據類型

  1. 什麼是不可變/可變類型數據

    • 能在原地修改的數據是可變類型數據
    • 不能再原地修改的數據(修改就會開闢新的記憶體空間)是不可變類型數據
  2. 整型是不可變類型數據

  3. id() 函數:查看記憶體地址

    a = 10  print(id(a))  # 1956675984  a = a + 1  print(id(a))  # 1956676016

二、字元串(str)

(一)索引

  1. 什麼是索引?

    • 索引就是下標,python中索引是從0開始的
  2. 索引只給有序數據類型使用

  3. 索引的表示

    • str[下標]
  4. 正索引和反索引

    • 正索引:從左到右依次 0,1,2 …
    • 反索引:從右到左依次 -1,-2,-3 …
    a = "糞發塗牆的郭老濕"  print(a[0])  # 糞  print(a[3])  # 牆  print(a[5])  # 郭  print(a[-3])  # 郭
  • 注意:索引時,超出最大索引值會報錯

    a = "糞發塗牆的郭老濕"  print(a[10])  # IndexError: string index out of range

(二)切片

  • 上面的例子,如果想要得到"糞發塗牆",只能挨個索引再進行拼接

    a = "糞發塗牆的郭老濕"  a1 = print(a[0])  a2 = print(a[1])  a3 = print(a[2])  a4 = print(a[3])  print(a1 + a2 + a3 + a4)  # 糞發塗牆

    是不是很麻煩 ,可以利用切片

  1. 切片只給有序數據類型使用

  2. 切片格式

    • str[start: end: step]
    • 默認step為1
  3. 特點:顧頭不顧腚

    • 從開頭切片不用輸入start;

      切到結尾不用輸入end;

      從開頭切到結尾都不用輸入

    a = "糞發塗牆的郭老濕"  mes = a[:4]  # 從開頭切不用輸入start  print(mes)  # 糞發塗牆
    • step為步長,可以利用step間隔切片
    a = "糞發塗牆老污郭"  print(a[::2])  # 糞塗老郭
    • 步長若為負數,則反向切片

      注意:若反向切片,start和end的位置是從後往前取的

    a = "糞發塗牆老污郭"  print(a[::-2])  # 郭老塗糞  print(a[-2:-6:-1])  # 污老牆塗  
    • 將字元串反轉可以利用切片
    a = "糞發塗牆老污郭"  a_inversion = a[::-1]  print(a_inversion)  # 郭污老牆塗發糞  
  • 索引時,超出最大索引值不會報錯

(三)方法詳解

  • str.upper() 全部變為大寫
    str.lower() 全部變為小寫
    str.startswith(n) 判斷是否以n開頭
    str.endswith(n) 判斷是否以n結尾
    str.count(n) 計算n出現的次數
    str.strip() 去掉兩端空格、n、t
    str.split(n) 以n切割
    str.replace(old, new) 替換
    str.isalnum() 判斷是否由數字、中文、字母構成
    str.isalpha() 判斷是否由中文、字母構成
    str.isdigit() 判斷是否由阿拉伯數字構成
    str.isdecimal() 判斷是否由十進位數字構成
  1. str.upper()

    • 將字元串全部變為大寫,只對字母生效,對其他不報錯
    a = "zxdznb"  new_a = a.upper()  print(a)  # 不可變類型,原字元串不變  print(new_a)  # ZXDZNB  
  2. str.lower()

    • 將字元串全部變為小寫,只對字母生效,對其他不報錯
    a = "ZXDZNB"  new_a = a.lower()  print(a)  # 不可變類型,原字元串不變  print(new_a)  # zxdznb  
  • 應用:登錄驗證碼,不區分大小寫

    verify_code = "eF7d"  while True:    user = input("帳號:")    pwd = input("密碼:")    while True:        print(f"驗證碼:{verify_code}")        vc = input("請輸入驗證碼:")        if vc.upper() == verify_code.upper():  # 全部變為大寫            break        else:            print("輸入錯誤,請重新輸入!")    if user == "ZXD" and pwd == "zxd123":        print("歡迎回來")        break    else:        print(」帳號密碼錯誤,請重新輸入!「)  
  1. str.startswith(n)

    • 判斷字元串是否以參數n開頭,輸出為布爾值
    • 還可以判斷切片的開頭
    a = "zxdznb"  print(a.startswith("z"))  # True  print(a.startswith("x"))  # False    print(a.startswith("x", 1, 5))  # True  print(a.startswith("z", 1, 5))  # False  
  2. str.endswith(n)

    • 判斷字元串是否以參數n結尾,輸出為布爾值
    • 還可以判斷切片的結尾
    a = "zxdznb"  print(a.endswith("b"))  # True  print(a.endswith("x"))  # False    print(a.endswith("n", 1, 5))  # True  print(a.endswith("z", 1, 5))  # False  
  3. str.count(n)

    • 計算參數n在字元串中出現的次數
    • 還可以切片計算變數n出現的次數
    a = "zxdznb"  print(a.count("z"))  # 2    print(a.count("z", 0, 3))  # 1  
  4. str.strip()

    • 默認去掉字元串兩端空格、換行符(n)、製表符(t)
    • 也可以去掉指定內容
    a = "   zxdznb   "  a1 = a.strip()  print(a1)  # zxdznb    a2 = a1.strip("b")  print(a2)  # zxdzn  
  • 應用:去掉用戶輸入帳號密碼時,手誤多打的空格

    while True:    user = input("帳號:").strip()    pwd = input("密碼:").strip()    if user == "ZXD" and pwd == "zxd123":        print("歡迎回來!")        break    else:        print("帳號密碼錯誤,請重新輸入")  
  1. str.split()

    • 默認以空格、換行符(n)、製表符(t)切割字元串,得到的是一個列表,
    • 也可以指定字元切割
    • 還可以填入第二個參數,可以指定切割次數
    a1 = "zxd znb"  lst1 = a1.split()  print(lst1[0], lst1[1])  # zxd znb    a2 = "zxd,znb"  lst2 = a2.split(",")  print(lst2[0], lst2[1])  # zxd znb    a3 = "xdznbznb"  lst3 = a3.split("z", 1)  print(lst3[0], lst3[1])  # xd nbznb  
  2. str.replace(old, new)

    • 將字元串中的字元替換成新字元
    • 可以指定替換次數,默認全部替換
    a = "zxdhnbhnb"  new1_a = a.replace("h", "z")  print(new1_a)  # zxdznbznb  # 全部替換    new2_a = a.replace("h", "z", 1)  print(new2_a)  # zxdznbhnb  # 替換一次  
  3. str.isalnum()

    • 判斷字元串是否由數字、中文、字母組成
    a1 = "zxd666"  a2 = "zxd_666"  print(a1.isalnum())  # True  print(a2.isalnum())  # False  
  4. str.isalpha()

    • 判斷字元串是否由字母、中文組成
    a1 = "zxd最nb"  a2 = "zxd666"  print(a1.isalpha())  # True  print(a2.isalpha())  # False  
  5. str.isdigit()

    • 判斷字元串是否由阿拉伯數字組成
    a1 = "666"  a2 = "六六六"  print(a1.isdigit())  # True  print(a2.isdigit())  # False  
  6. str.isdecimal()

    • 判斷字元串是否由十進位數字組成
    a1 = "66"  a2 = "0x42"  print(a1.isdecimal())  # True  print(a2.isdecimal())  # False  

三、for循環

(一)for循環和while循環的區別

  • for循環:有限循環
  • while循環:無限循環

(二)for循環的結構

  • for i in xxx:    循環體  
    • for:關鍵字
    • i:變數名
    • in:關鍵字
    • xxx:可迭代對象

(三)len() 函數

  • 查詢數據的長度,通用函數用於所有數據類型

(四)for循環舉例

  • 一個面試題

    for i in "abcde":      pass  print(i)  # 循環最後給變數i賦值的是e,沒有變動e一直指向e  
  • 理解for循環和函數自上而下執行機制

    num = 1  count = 3  while count:    for i in "abc":        print(i + str(num),end=",")    print()    count -= 1    num += 1  
    輸出結果:  a1,b1,c1,  a2,b2,c2,  a3,b3,c3,