作為一個剛入門編程的大一狗,第一次寫博客,希望能對自己學的知識進行鞏固和提升,也希望記錄自己成長的過程。 學習Python,一是因為暑假學的c++頭疼,聽說Python簡單,那我就試試吧,二是因為Python形勢一片大好,算是附和潮流吧! 一、初識Python 1、第一個Python代碼 依然是熟悉 ...
作為一個剛入門編程的大一狗,第一次寫博客,希望能對自己學的知識進行鞏固和提升,也希望記錄自己成長的過程。
學習Python,一是因為暑假學的c++頭疼,聽說Python簡單,那我就試試吧,二是因為Python形勢一片大好,算是附和潮流吧!
一、初識Python
1、第一個Python代碼
1 print("Hello World")
依然是熟悉的Hello World, 對於只學過c和c++的我來說,著實有點奇怪,怎麼main()沒了(其實是有的),頭文件也沒了,甚至連一句語句的末尾標識逗號也不見蹤影。
2、概覽
用下麵一段猜大小的代碼碼來解釋一下python與c(c++)的區別
c:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 5 int main(void) 6 { 7 int try_num, true_num, x, count; 8 9 while(1) 10 { 11 printf("請選擇: 1.猜大小 2.退出: "); 12 scanf("%d", &x); 13 if(x == 2) 14 break;
15 srand(time(0)); 15 true_num = rand() % 100 + 1; 16 printf("請輸入你猜的數字(1-100): "); 17 scanf("%d", &try_num); 18 count = 1; 19 while(try_num != true_num) 20 { 21 if(try_num >= 1 && try_num <= 100) 22 { 23 if(try_num > true_num) 24 printf("你猜大了!\n"); 25 else 26 printf("你猜小了!\n"); 27 } 28 else 29 printf("你輸入的數字有誤!\n"); 30 printf("請再次輸入你猜的數字: "); 31 scanf("%d", &try_num); 32 count++; 33 } 34 printf("你終於猜對了, 共用了%d次.\n", count); 35 } 36 37 return 0; 38 }
Python:
1 import random 2 3 4 while True: 5 x = int(input("請選擇: 1.猜大小 2.退出: ")) 6 if x == 2: 7 break 8 true_num = random.randint(1, 100) 9 try_num = int(input("請輸入你猜的數字(1-100): ")) 10 count = 1 11 while try_num != true_num: 13 if try_num in range(1, 101): 14 if try_num > true_num: 15 print("你猜大了!") 16 else: 17 print("你猜小了!") 18 else: 19 print("你輸入的數字有誤!") 20 try_num = int(input("請再次輸入你猜的數字: ")) 21 count += 1 22 print("你終於猜對了, 共用了%d次" % count)
能清楚的看出,用Python寫出的代碼較c簡潔美觀,沒有冗餘,在語法上的幾點區別總結如下:
- 變數沒有類型的聲明,而是根據右側表達式推斷
- 語句結尾沒有分號
- 迴圈語句和條件語句均以冒號標誌其內部
- 以縮進而不是大括弧來區分作用域
- ...
兩者也具有高級語言的類似特點:
- 都有條件語言,迴圈語言,判斷語言等,大體用法相同,最大區別是in的使用,類似於c++11中的範圍for
- 都有基本的運算符,但是python增加了**,//,<>,去掉了邏輯運算符中的符號表達,全部由and,or,not等關鍵詞表示
- ...
二、基本數據類型
與c不同,Python的面向對象特征更加明顯,連int,float等也有自己的方法;
與c++相比,Python的list,tuple,dict 等相較與STL的容器更容易使用,內置的方法也較豐富
1、int, float, complex
1 # int 方法 2 def bit_length(self): 3 pass 4 # 返回該整數用二進位表示時的最小位數 5 6 def __divmod__(self, *args, **kwargs): 7 pass 8 # 返回一個tuple, 包含兩個元素,分別為self 與 argument相除的商和餘數 9 10 11 # float 方法 12 def as_integer_ratio(self): 13 pass 14 # 返回一個tuple, 即將float轉化為分數形式 15 16 def fromhex(self, string): 17 pass 18 # 返回16進位表示的string轉化為的float 19 20 def hex(self): 21 pass 22 # 與fromhex()相反 23 24 def is_integer(self, *args, **kwargs): 25 pass 26 # 返回 bool,判斷float是否為整數 27 28 29 # complex 方法 30 def conjugate(self): 31 pass 32 # 返回覆數的共軛複數int, float,complex方法
對於complex a, 可以通過a.real和a.imag使用其實部和虛部
2、bool: True, False
例如, 可以
1 a = True 2 while a: 3 # ... 4 if ...: 5 a = False
3、str: 通過'', "" 或 str()構建
1 def capitalize(self): 2 pass 3 # 返回str的首字母大寫,其餘小寫的形式, str不變 4 5 def casefold(self): 6 pass 7 # 返回str的所有字母變為小寫的形式, str不變 8 9 def center(self, width, fillchar=None): 10 pass 11 # 返回str居中,長度為width,左右以fillchar填充的形式,str不變 12 13 def count(self, sub, start=None, end=None): 14 pass 15 # 返回str中[start, end)範圍內sub的數目 16 17 def endswith(self, suffix, start=None, end=None): 18 pass 19 # 返回str的[start, end) 子序列是否以suffix結尾 20 21 def expandtabs(self, tabsize=8): 22 pass 23 # 返回str的所有tab變成tabsize長度的空格, str不變 24 25 def find(self, sub, start=None, end=None): 26 pass 27 # 返回str的[start, end) 範圍內sub的位置, 未找到返回-1 28 29 def rfind(self, sub, start=None, end=None): 30 pass 31 # 與find()不同的是從右向左 32 33 def format(self, *args, **kwargs): 34 pass 35 # 返回str的格式化的字元串, 使用{}而非%,str不變 36 37 def index(self, sub, start=None, end=None): 38 pass 39 # 返回str的[start, end) 子序列的sub所在的下標, 未找到報錯 40 41 def rindex(self, sub, start=None, end=None): 42 pass 43 # 與index()不同的是從右向左 44 45 def isalnum(self): 46 pass 47 # 返回str是否全部由字母和數字構成 48 49 def isalpha(self): 50 pass 51 # 返回str是否全部由字母構成 52 53 def isdigit(self): 54 pass 55 # 返回str是否全部由數字構成 56 57 def islower(self): 58 pass 59 # 返回str是否所有字母都是小寫 60 61 def isupper(self): 62 pass 63 # 返回str是否所有字母都是大寫 64 65 def isspace(self): 66 pass 67 # 返回str是否全部由空白字元構成 68 69 def istitle(self): 70 pass 71 # 返回是否所有單詞都是大寫開頭 72 73 def join(self, iterable): 74 pass 75 # 返回通過指定字元str連接序列iterable中元素後生成的新字元串 76 77 def ljust(self, width, fillchar=None): 78 pass 79 # 返回str左對齊,不足width的以fillchar填充, str不變 80 81 def rjust(self, width, fillchar=None): 82 pass 83 # 返回str右對齊,不足width的以fillchar填充, str不變 84 85 def lower(self): 86 pass 87 # 返回str全部小寫的拷貝, str不變 88 89 def upper(self): 90 pass 91 # 返回str全部大寫的拷貝, str不變 92 93 def swapcase(self): 94 pass 95 # 返回str全部大小寫交換的拷貝, str不變 96 97 def strip(self, chars=None): 98 pass 99 # 返回str移除左右兩側所有chars的拷貝,str不變 100 101 def lstrip(self, chars=None): 102 pass 103 # 返回str移除左側所有chars的拷貝,str不變 104 105 def rstrip(self, chars=None): 106 pass 107 # 返回str移除右側所有chars的拷貝,str不變 108 109 def partition(self, sep): 110 pass 111 # 返回str以sep分割的前,sep,後部分構成的tuple, 112 # 未發現返回sep和兩個空字元構成的tuple 113 114 def rpartition(self, sep): 115 pass 116 # 和partition()不同的是從右向左 117 118 def replace(self, old, new, count=None): 119 pass 120 # 返回str把count數目的old替換為new的拷貝,str不變 121 122 def split(self, sep=None, maxsplit=-1): 123 pass 124 # 返回一個以sep分隔str的maxsplit(預設最大)的list,str不變 125 126 def rsplit(self, sep=None, maxsplit=-1): 127 pass 128 # 和split()不同的是從右向左 129 130 def splitlines(self, keepends=None): 131 pass 132 # 返回一個以\n或\r或\r\n分隔的list,若keepends=true,保留換行 133 134 def startswith(self, prefix, start=None, end=None): 135 pass 136 # 返回str的[start, end)範圍內是否以prefix開頭 137 138 def title(self): 139 pass 140 # 返回所有單詞是大寫開頭的拷貝,str不變 141 142 def zfill(self, width): 143 pass 144 # 返回str的以width為長度,不夠左側補0的拷貝(不會截短),str不變 145 146 def maketrans(self, *args, **kwargs): 147 pass 148 # 返回生成的一個翻譯表,與translate()搭配使用 149 150 def translate(self, table): 151 pass 152 # 根據maketrans()生成的table來翻譯str,返回拷貝,str不變str方法
a.對str中的方法的總結:
- 大小寫,空格與table,特定格式等的轉化,替換: capitalize,casefold,expandtabs,format,lower,upper,swapcase,replace,title,maketrans,translate
- 填充與移除字元串,連接與分隔字元串: center,strip,lstrip,rstrip,join,ljust,rjust,partition,rpartition,split,rsplit,splitlines,zfill
- 子序列數目,位置:count,find,rfind,index,rindex
- 判斷字母,數字,大小寫,空格,開頭,結尾 :endswith,isalnum,isalpha,isdigit,islower,isupper,isspace,istitle,startswith
- 和左右掃描方向有關的方法一般還包括一個r__()方法,表示從右向左掃描
- 所有方法均不改變str,只是返回一個拷貝或bool
b.幾個方法詳解:
- format:
1 # 通過位置 2 string1 = "{0} is the most {1} teacher of life" 3 str1 = string1.format("Suffering", "powerful") 4 # str1 = "Suffering is the most powerful teacher of life" 5 string2 = "{0}, {1}, {0}" 6 str2 = string2.format("Edward", "Tang"} 7 # str2 = "Edward, Tang, Edward" 8 9 # 通過關鍵詞 10 string = "{name} is {age}" 11 str = string.format(name="Edward", age=19) 12 # str = "Edward is 19" 13 14 # 填充和對齊 15 # ^、<、>分別是居中、左對齊、右對齊,後面帶寬度 16 # :號後面帶填充的字元,只能是一個字元,不指定的話預設是用空格填充 17 string1 = "{: >6}" 18 str1 = string1.format("Ed") 19 # str1 = " Ed" 20 string2 = "{:*<6}" 21 str2 = string2.format("Ed") 22 # str2 = "Ed****" 23 24 # 控制精度 25 string = “{:.2f}” 26 str1 = string.format(3.1415926) 27 # str1 = "3.14" 28 29 # 金額分隔符 30 string = "{:,}" 31 str = string.format(1234567) 32 # str = "1,234,567"
- maketrans和translate:
1 # s.maketrans('s1', 's2') s1 和 s2 的長度必須一致,生成一個轉換表 2 # s.translate(table) 對字元串s按照table里的字元映射關係替換 3 s = "I was a handsome boy" 4 table = s.maketrans("abcde", "12345") 5 str = s.translate(table) 6 # str = "I w1s 1 h1n4som5 2oy"
- join和split:
1 # join用於用指定str連接參數的str序列 2 lst = ['a', 'b', 'c', 'd'] 3 s = '-'.join(lst) 4 # s = "a-b-c-d" 5 6 def accum(s): 7 return '-'.join(c.upper() + c.lower() * i for i, c in enumerate(s)) 8 # s = "abcd",返回 “A-Bb-Ccc-Dddd” 9 10 # split用於用指定參數拆分str 11 s = "a-b-c-d" 12 lst = s.split('-') 13 # lst = ['a', 'b', 'c', 'd']
c.索引和切片:
Python中的索引和C類似,但是可以從右邊開始:
1 word = "python" 2 # word[0] = 'p' 3 # word[5] = 'n' 4 # word[-1] = 'n', 表示最後一個, -0和0一樣
除了索引, 還支持切片:
1 word = "python" 2 # word[0: 2] = 'py' 3 # word[2: 5] = 'tho' 4 # word[: 2] = 'py', 等同於[0: 2] 5 # word[3:] = 'hon', 等同於[3: len(word)]
切片和c++中的迭代器類似,都是為單閉合區間;
切記str是const的, 不可以通過賦值等改變它們
4、list:通過[]或list()構建
1 def append(self, p_object): 2 pass 3 # 添加元素p_object到list末尾,p_object可以是任何類型 4 5 def clear(self): 6 pass 7 # 清空list中的元素 8 9 def copy(self): 10 pass 11 # 返回一個list的淺拷貝 12 13 def count(self, value): 14 pass 15 # 返回list中的value的個數 16 17 def extend(self, iterable) 18 pass 19 # 添加整個iterable到list末尾,擴展list 20 21 def index(self, value, start=None, stop=None): 22 pass 23 # 返回子序列[start, stop)中value第一次出現的下標,未找到報錯 24 25 def insert(self, index, p_object): 26 pass 27 # 插入一個p_object到下標為index的元素之前 28 29 def pop(self, index=None): 30 pass 31 # 彈出index位置的元素並返回此元素, list為空或index超出範圍會報錯 32 33 def remove(self, value): 34 pass 35 # 清除list中第一個值為value的元素,不返回此值 36 37 def reverse(self): 38 pass 39 # 反轉整個list 40 41 def sort(self, key=None, reverse=False): 42 pass 43 # 排序list,key可以為lambda或cmp,reverse為True需要反轉list方法
a.對list中方法的總結:
- 添加:append, extend, insert
- 刪除:clear, pop, remove
- 搜素:count, index
- 拷貝:copy
- 排序:sort
- 反轉:reverse
- 與str不同,list中元素大都直接修改list,返回None而不是拷貝
b.幾個方法詳解:
- append和extend:
1 lst = [1, 5, 4, 3, 8] 2 lst.append(3) 3 # lst = [1, 5, 4, 3, 8, 3] 4 lst.append([1, 2, 3]) 5 # lst = [1, 5, 4, 3, 8, 3, [1, 2, 3]],始終把參數當做一個元素 6 lst.extend([1, 2, 3]) 7 #[1, 5, 4, 3, 8, 3, [1, 2, 3], 1, 2, 3],合併為一個list
c.索引和切片:
與str基本一致,但是由於list可變,還存在一個del語言:
1 lst = [3, 4, 5, 6, 7] 2 del lst[0] 3 # lst = [4, 5, 6, 7] 4 del lst[1:3] 5 # lst = [4, 7] 6 del lst[:] 7 # lst = []
5.tuple:通過()或tuple()構建(括弧可以省略), 只包含一個元素時,在元素後面添加逗號
def count(self, value): pass # 返回tuple中value的個數 def index(self, value, start=None, stop=None): pass # 返回子序列[start, stop)中第一個值為value的下標tuple方法
tuple和list的區別在於其不能改變,所有很多方法沒有
tuple也有索引和切片,不再贅述
要想對tuple進行強制修改,可以通過list()構造
6.dict:通過{}或dict()構建
1 def clear(self): 2 pass 3 # 清空dict中的元素 4 5 def copy(self): 6 pass 7 # 返回dict的一個拷貝 8 9 def fromkeys(*args, **kwargs): 10 pass 11 # 返回一個dict,所有的key都對應同一個value(預設為None) 12 13 def get(self, k, d=None): 14 pass 15 # 返回key為k時對應的value,如果不存在,返回d 16 17 def setdefault(self, k, d=None): 18 pass 19 # 返回key為k時對應的value,如果不存在,添加一個k: d 20 21 def items(self): 22 pass 23 # 返回dict中所有key, value構成的dict_items() 24 25 def keys(self): 26 pass 27 # 返回dict中所有key構成的dict_keys() 28 29 def values(self): 30 pass 31 # 返回dict中所有value構成的dict_values() 32 33 def pop(self, k, d=None): 34 pass 35 # 彈出dict中k所對應的value,沒找到返回d 36 37 def popitem(self): 38 pass 39 # 隨機彈出dict中一個(key, value),dict為空時出錯 40 41 def update(self, E=None, **F): 42 pass 43 # 用另一個dict F 來更新原dict, 返回Nonedict方法
a.對dict中方法的總結:
- 添加:直接用dic[key] = value即可添加
- 刪除:clear, pop, popitem
- 查找, 引用:get, setdefault, items, keys, values
- 構建:copy, fromkeys, update
- 與list類似,但由於是無序的,所有沒有下標的操作,且popitem彈出的元素也是隨機的
b.幾個方法詳解:
- pop和popitem:
1 dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} 2 # key為str的構建時也可以寫成 dic = dict(k1 = 'v1', k2 = 'v2', k3 = 'v3) 3 k = dic.pop('k1') 4 # k = 'v1'且 dic = {'k2': 'v2', 'k3': 'v3'} 5 item = dic.popitems() 6 # item = (‘k2’, 'v2')或('k3', v3') 因為dic是無序的,且dic會隨之變化
- get和setdefault:
1 dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} 2 s1 = get('k1') # s1 = dic['k1'] 3 s2 = get('k4', 'v4') # s2 = 'v4'