python基礎
摘要:
此篇只針對有程式設計基礎的同學
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# python 3.x 學習筆記
# 其中一些函式與JavaScript進行了對比
# pyhon 與 JavaScript 都是 動態語言, 所以變數...
此篇只針對有程式設計基礎的同學
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # python 3.x 學習筆記 # 其中一些函式與JavaScript進行了對比 # pyhon 與 JavaScript 都是 動態語言, 所以變數型別可以相互轉換 # python 部分內建屬性是大寫開頭的, 應當注意, 如 False, True, None # Python的整數沒有大小限制,而某些語言的整數根據其儲存長度是有大小限制的,例如Java對32位整數的範圍限制在-2147483648-2147483647 # python 中 沒有; # 不要對小數做 ^ 運算, 會報錯 # 廖雪峰的官方網站: https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 # 菜鳥教程: http://www.runoob.com/python/python-tutorial.html # 列印文字, 相當於 console.log print('hello world') print('hello', 'world') # 定義變數, 相當於 var, python沒有常量 name = 'mtshen' PI = 3.1415926 print('name:', name, '\r\n', 'PI:', PI) # && 運算 f1 = True and True print('f1:', f1) # || 運算 f2 = True or False print('f2:', f2) # ! 運算 f3 = not False print('f3:', f3) # 求餘 f4 = 10 % 3 print('f4:', f4) # 地板求值, 值始終是整數 f5 = 10 // 3 print('f5:', f5) # 定義長文字 f6 = '''hello world hello world hello world''' print('f6:', f6) # 文字轉義\ f7 = 'I\'m mtshen!' print('f7:', f7) # 定義非轉義文字(內容全部不轉義) f8 = r"I'm mtshen" print('f8:', f8) # 等待使用者輸入 # 注意, 這是阻斷性的, 使用者沒有輸入完成後面的程式不會繼續執行 f9 = input() print('f9:', f9) # 格式化字串 % 運算子 # %s表示用字串替換 # %d表示用整數替換 # %f表示用浮點數替換 # %x表示用十六進位制整數替換 # 如果只有一個%?,括號可以省略 f10 = 'hello, %s' % 'world' f11 = 'hello %s, %d, %f, %x' % ('world', 100, 100, 100) print('f10:', f10, '\r\n', 'f11', f11) # 字串編碼 類似於 String.charCodeAt f12 = ord('A') print('f12:', f12) # 字串解碼 類似於 String.fromCharCode f13 = chr(97) print('f13:', f13) # 定義bytes字串 f14 = b'\xe4\xbd\xa0\xe5\xa5\xbd \xe4\xb8\x96\xe7\x95\x8c' print('f14:', f14) # 編碼成為bytes字串 f15 = '你好 世界'.encode('utf-8') print('f15:', f15) # 解碼bytes字串 f16 = b'\xe4\xbd\xa0\xe5\xa5\xbd \xe4\xb8\x96\xe7\x95\x8c'.decode('utf-8') print('f16:', f16) # 解碼bytes 相容處理 f17 = b'\xe4\xbd\xa0\xe5\xa5\xbd\xe4'.decode('utf-8', errors='ignore') print('f17:', f17) # 計算字元長度 f18 = len('hello world') f19 = len(b'\xe4\xbd\xa0\xe5\xa5\xbd \xe4\xb8\x96\xe7\x95\x8c') print('f18:', f18, '\r\n', 'f19:', f19) # ======================================== # 列表 List 相當於 Array l1 = ['hello', 'world'] print('l1:', l1) # 列表長度 l2 = len(['hello', 'world']) print('l2:', l2) # 列表倒獲取-1就是倒數第一位, 依次類推 l3 = [0, 1, 2, 3, 4, 5][-1] print('l3:', l3) # 末尾追加, 相當於push l4 = [0, 1, 2, 3, 4] l4.append(5) print('l4:', l4) # 插入任意位置 l5 = [0, 1, 2, 3, 4] l5.insert(2, '5') print('l5:', l5) # 刪除尾元素 pop, 如果傳入值則刪除指定的位置 l6 = [0, 1, 2, 3, 4, 5] l6.pop(1) print('l6:', l6) # 元組 Tuple 相當於 new Array(X), 他的長度是不可變化的 t1 = ('hello', 'world') print('t1:', t1) # 列印某一位, 與list一致 t2 = ('hello', 'world')[0] print('t2:', t2) # 判斷 a1 = 100 if a1 > 50: print('a1: a1 > 50') # else a2 = 40 if a1 > 50: print('a2: a2 > 50') else: print('a2: a2 < 50') # elif a3 = 50 if a3 > 50: print('a3: a3 > 50') elif a3 == 50: print('a3: a3 = 50') else: print('a3: a3 < 50') # 轉換字串為整數 int a4 = int('100') print(a4) # 練習 # 請根據BMI公式(體重除以身高的平方)計算BMI指數,並根據BMI指數: # 體質指數(BMI)= 體重(kg) ÷ 身高^2(m) # 低於18.5:過輕 # 18.5-25:正常 # 25-28:過重 # 28-32:肥胖 # 高於32:嚴重肥胖 print('練習1: BMI') weight = float(input('weight(kg): ')) height = float(input('height(m): ')) bim = weight / (height * height) print('你的BIM指數為: %s' % bim) if bim < 18.5: print('你的體重過輕了') elif bim < 25: print('你的體重正常') elif bim < 28: print('你的體重過重了') elif bim < 32: print('你的體重過於肥胖') else: print('你的體重嚴重肥胖') # ====================================== # 迴圈 # for...in... x1 = [1, 2, 3, 4, 5] for x in x1: print('x1 迴圈:', x) # while x2 = 0 while x2 > 10: x2 = x2 + 1 print('x2 迴圈:', x2) # 生成整數序列 x3 = range(5) print('x3:', x3) # 轉換成list x4 = list(range(5)) print('x4:', x4) # break結束迴圈 x5 = list(range(100)) for x in x5: if x == 10: break else: print('x5 迴圈:', x) # 跳出某一次迴圈 continue x6 = list(range(10)) for x in x6: if x == 6: continue else: print('x6 迴圈:', x) # Dict字典,類似Object # key 必須加引號, 不能使用.運算子, 如果沒有符合的key會報錯 d1 = { 'name': 'mtshen' } print('d1:', d1) print('d1 name:', d1['name']) # 判斷key是否存在 d2 = 'name' in { 'name': 'mtshen' } print('d2:', d2) # 使用get獲取對用value, 如果不存在不會報錯會返回None或自己預定的字元 d3 = {'name': 'mtshen'}.get('data') d4 = {'name': 'mtshen'}.get('data', 'hello world') print('d3:', d3, '\r\n', 'd4:', d4) # 刪除某個key d5 = {'name': 'mtshen', 'data': 'hello world'} d5.pop('data') print('d5:', d5) # Set 鍵不可重複 s1 = set([1, 1, 2, 2, 3, 3]) # {1, 2, 3} print('s1:', s1) # 新增鍵 s2 = set([1, 2, 3]) s2.add(4) # {1, 2, 3, 4} print('s2:', s2) # 刪除鍵 s3 = set([1, 2, 3, 4, 5]) s3.remove(4) # {1, 2, 3, 5} print('s3:', s3) # ===================================================== # 函式 # 一些常用函式與JavaScript函式差不多, 如 # abs(): Math.abs(), max(): Math.max(), min(): Math.min() # int(): Number.parseInt(), float(): Number.parseFloat(), bool(): Boolean() # 定義函式 def def fn1(x): print('fn1:', x) fn1('hello world') # 定義空函式 def fn2(): pass fn2() # 型別檢查 isinstance type1 = isinstance(1, int) print('type1', type1) # 多型別檢查 type2 = isinstance(1, (int, float)) print('type2', type2) # 主動丟擲型別錯誤 # 幾種錯誤型別 # TypeError 型別錯誤 # SyntaxError 語法錯誤 # IndexError 索引錯誤 # AttributeError 屬性錯誤 # KeyError 關鍵字錯誤 # ValueError 可能為字串字串錯誤 # IndentationError 縮排錯誤 # 更多詳見 https://blog.csdn.net/Karen_Yu_/article/details/78629918 # raise TypeError('type error!') # 報錯會阻斷程式執行, 解註釋可執行 # 返回值 return def fn3(): return 'hello world' print('fn3:', fn3()) # 多返回值 def fn4(): return 100, 500 # 相當於返回了一個tuple元素(100, 500), 返回值可省略括號 fnr1, fnr2 = fn4() # 接收返回值 print('fn4:', fnr1, fnr2) # 預設預設值, 設定預設值後執行函式, 可以不傳入指定引數 # !! python 中不要對預設的List, Dict, Set等可變型別值直接進行修改 # 因為預設引數共同指向了同一個不變物件 !!! def fn5(name = 'mtshen'): print('fn5:', name) fn5() # 不限定長度函式, 引數加* # * 相當於 函式中的引數解構 def fn6(*angs): print('f6:', angs) fn6(1, 2, 3, 4, 5) # 部分引數解構, 如果只有部分引數進行解構, 意味著必須傳入引數名, 以 key = value 的形式傳入 def fn8(name, value, **data): print('fn8:', name, value, data) fn8('mtshen', 21, a = 5, b = 6, c = 7) # 利用 * 對傳入引數解構 def fn7(name, value): print('f7:', name, value) fn7(*['mtshen', 'hello world']) # 關鍵字命名, 限定傳入的引數名, 必須以 key = value 的形式傳入, 這種方式傳入, 不限定傳入順序 # * 後的引數必須以 key = value 的形式傳入 def fn9(*, name, age): print('fn9:', name, age) fn9(age = 21, name = 'mtshen') # 如果引數中存在 *key 那麼等同於 *, 後面的引數必須以 key = value 的形式傳入 def fn10(name, *agrs, age): print('fn10:', name, agrs, age) fn10('mtshen', 1, 2, 3, 4, 5, age = 21) # 引數組合 # 在Python中定義函式,可以用必選引數、預設引數、可變引數、關鍵字引數和命名關鍵字引數 # 這5種引數都可以組合使用 # 但是請注意,引數定義的順序必須是:必選引數、預設引數、可變引數、命名關鍵字引數和關鍵字引數。 # 如 def fn11(name, age = 21, *agrs, **kw): pass # =================================================== # python 特性 # 切片, list切片即獲取某一區間的陣列內容 # 可以使用[min:max], [:max], [min:] 也可以輸入負值, 表述倒數位置 # 切片同樣適用於字串, list, 元組, 字典, set qp1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 10][1:4] # 1 - 4 但不包含 4, print('qp1:', qp1) # 利用切片淺拷貝 qp2 = qp1[:] print('qp2:', qp2) # 利用切片間隔取值 qp3 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10][::2] # 每間隔 2 個便取值 print('qp3:', qp3) # 切片間隔取值2 qp4 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10][:5:2] #下標為5 之前每間隔 2 個取值 print('qp4:', qp4) # 迭代 # 迭代中使用下標 enumerate 可以將 ['name'] 轉換成 [(0, 'name')] dd1 = ['name', 'age', 'data', 'value'] for index, data in enumerate(dd1): print('dd1:', index, data) # 列表生成器 # 如果要生成 1, 2, 3, 4, 5 可以使用 list1 = [x for x in range(1, 6)] print('list1:', list1) # 列表生成器基本結構是 # [結果表示式 for...in...{1,} if{0,}] # 如 list2 = ['value:' + str(value) for value in range(1, 11) if value > 5 ] print('list2:', list2) # 列表生成器中 for in 和 if 可以寫多個, 進行迭代 # 有木有很唬人, 其實原理很簡單 list3 = [(x, y) for x in range(1, 10) for y in range(1, 10) if x > 5 if y > 5] print('list3:', list3) # 生成器 # 生成器的目的在於計算一組有規律的列表內容, 在大量內容的情況下, 能夠減少記憶體的佔用 # 寫法與列表生成器一致, 只不過 [] 變成 () sc1 = (x * 6 for x in range(999999999)) # 生成 999999999 個數據 print('sc1:', sc1) # 生成器可以用for in 遍歷外, 還可以使用next來取得下一個生成內容 sc2 = next(sc1) print('sc2:', sc2) # yield 關鍵字建立生成器 #當使用 yield 時, 你的函式將變成生成器 generator, 每次next, 會執行到下一個 yield def yieldfn(): yield 1 yield 3 yield 5 yield 7 yieldfn0 = yieldfn() yieldfn1 = next(yieldfn0) yieldfn2 = next(yieldfn0) yieldfn3 = next(yieldfn0) yieldfn4 = next(yieldfn0) print('yieldfn:', yieldfn) print('yieldfn next:', yieldfn1) print('yieldfn next:', yieldfn2) print('yieldfn next:', yieldfn3) print('yieldfn next:', yieldfn4) # 迭代器 # 判斷屬性是否可以迭代, 前提是要引入 Iterable # from collections import Iterable # isinstance([], Iterable) # 字元轉迭代 # isinstance(iter('hello world'), Iterable)