[TOC]
記錄一下自己的python學(xué)習之旅澄惊,入門書籍為《python編程:從入門到實踐》缤削,運行環(huán)境為python3.6.3。也有一定的編程基礎(chǔ)滚婉,對于一些通用的語法不再贅述让腹,本篇主要記錄一下python一些不同于java的基本語法扣溺。
書寫格式
- 一句代碼的結(jié)束以換行為標志锥余,不需要分號。
- 建議每級縮進都使用四個空格嘲恍。
- 建議每行不超過80字符佃牛,建議注釋的行長不超過72字符俘侠。
- 不同的邏輯之間可用一個空行隔開。
- 代碼塊不需要大括號央星,python根據(jù)縮進來判斷代碼行與前一個代碼行的關(guān)系等曼。
- python變量和函數(shù)命名習慣采用小寫凿蒜,可用下劃線隔開废封,不像java采用駝峰命名法漂洋。
- 在條件測試的格式設(shè)置方面力喷,建議在諸如== 弟孟、>= 和<= 等比較運算符兩邊各添加一個空格拂募。
基本數(shù)據(jù)類型
- Number(數(shù)字)
- int(整型)
- long(長整型)
- float(浮點型)
- complex(復(fù)數(shù))
- String(字符串)
- List(列表)
- Tuplc(元組)
- Dictionary(字典)
常用計算符號
- +陈症,加號
- -,減號
- *趴腋,乘號
- /于样,除號
- %潘靖,取余
- //卦溢,整除
- **,乘方
變量
變量不需要聲明吐辙。
message = "Hello Python"
print(message)
字符串
- 字符串可以用雙引號蘸劈,也可以用單引號威沫,這樣可以方便的在字符串中使用引號棒掠,當然也可以像java一下通過轉(zhuǎn)義字符表示引號。
- 下標從左到右從0開始颈墅,從右到左從-1開始恤筛,-1表示最后一個字符毒坛。
- 截取字符串使用 str[開始下標 :結(jié)束下標]。
- python中的字符串也封裝了許多的基本操作方法述么,比如大小寫轉(zhuǎn)換度秘,去首尾空格等,可以在使用過程中慢慢去熟悉唆貌。
message = " Hello world "
print(message.title()) # 首字母大寫
print(message.lower()) # 轉(zhuǎn)換小寫
print(message.upper()) # 轉(zhuǎn)換大寫
print(message.count("o")) # 字符計數(shù)
print(message.strip()) # 去首尾空格
print(message.lstrip()) # 去開頭空格
print(message.rstrip()) # 去結(jié)尾空格
print(message.__len__()) # 字符串長度
數(shù)字
- 數(shù)字和字符串不能直接拼接锨咙。
print("Hello " + 213) # TypeError: must be str, not int
print("Hello " + str(213)) # Hello 213
整數(shù)
- python中可以用 ** 表示乘方運算
- python3中兩個整數(shù)相除時酪刀,會得到真實的結(jié)果骂倘,而python2中只會得到整數(shù)部分历涝,這與java類似(3/2=1)。
print(2 ** 3) # 8
print(3 / 2) # 1.5
print(4 / 3) # 1.3333333333333333
注釋
- python中注釋用#來表示堰塌。
列表
有序集合蔫仙,用[]表示。類似于但又不同于java中的數(shù)組恤煞、集合居扒。
- python中的列表不要求數(shù)據(jù)類型相同喜喂,及不用類型的數(shù)據(jù)可以放到同一個列表中玉吁,姑且簡單理解為List<Object>进副。
- 有序集合,因此支持按索引訪問给赞,索引從0開始片迅。不同的是python還支持反向索引柑蛇,-1代表最后一個數(shù)據(jù)唯蝶,-2代表倒數(shù)第二個,依次類推鼓蜒。
names = ["Allen", "Toto", 123]
print(names) # ['Allen', 'Toto', 123]
print(names[1]) # Toto
print(names[-1]) # 123
- 修改元素:類似于java數(shù)組都弹,直接通過索引賦值修改畅厢。
- 添加元素:提供append和insert方法框杜,分別用于在列表末尾追加和在指定索引位置插入新元素咪辱。也可以通過extend方法直接在末尾追加一個列表椎组。
- 刪除元素:提供pop和remove方法寸癌,分別用于刪除指定索引和指定值的元素蒸苇。也可用del語句來刪除填渠。注意remove方法只是刪除一個元素,如果列表中有多個相同元素莺葫,可以通過循環(huán)刪除捺檬。
names = ["Allen", "Toto", 123]
print(names) # ['Allen', 'Toto', 123]
names[2] = 456
print(names) # ['Allen', 'Toto', 456]
names.append(True)
print(names) # ['Allen', 'Toto', 456, True]
names.insert(1, 123)
print(names) # ['Allen', 123, 'Toto', 456, True]
del names[-1]
print(names) # ['Allen', 123, 'Toto', 456]
test = names.pop(-1)
print(names) # ['Allen', 123, 'Toto']
print(test) # 456
names.remove("Allen")
print(names) # [123, 'Toto']
- 排序:注意只有所有元素為相同類型的列表可以排序聂受】靖洌可以通過列表的sort方法或者sorted函數(shù)來進行排序炮叶,其中sort會改變原列表镜悉,sorted不會改變原列表侣肄。也可以通過參數(shù)來控制順序稼锅。
names = ["Allen", "Toto", "Lili"]
names.sort()
print(names) # ['Allen', 'Lili', 'Toto']
names.sort(reverse=True)
print(names) # ['Toto', 'Lili', 'Allen']
print(sorted(names)) # ['Allen', 'Lili', 'Toto']
print(names) # ['Toto', 'Lili', 'Allen']
- 遍歷:通過for循環(huán)進行遍歷缰贝,類似于java中的foreach語句剩晴,僅僅是寫法不同赞弥。
names = ["Allen", "Toto", "Lili"]
for item in names: # 注意最后有個冒號,代碼塊需要縮進
print(item)
如果需要對索引和值同時迭代绽左,可以使用python內(nèi)置的enumerate函數(shù):
names = ["Allen", "Toto", "Lili"]
for index,item in enumerate(names): # 注意最后有個冒號,代碼塊需要縮進
print(index,item)
- 數(shù)值列表:python使用range函數(shù)可以很方便的創(chuàng)建一個數(shù)值列表拼窥,結(jié)果符合編程中最常見的差一行為鲁纠,比如range(1,6)鳍寂,實際生成的為1到5這五個數(shù)字迄汛。
nums = list(range(1, 6)) # 創(chuàng)建數(shù)值列表
print(nums) # [1, 2, 3, 4, 5]
# range還支持步數(shù)
nums = list(range(1, 6, 2)) # [1, 3, 5]
print(nums)
- 列表解析:將for循環(huán)和創(chuàng)建新元素的代碼合并成一行鹃觉,并自動附加新元素。下面兩種寫法是等價的笼裳。
nums = list()
for item in range(1, 6):
nums.append(item ** item)
print(nums) # [1, 4, 27, 256, 3125]
# 列表解析的格式為[表達式 + for循環(huán)]
nums = [item ** item for item in range(1, 6)]
print(nums) # [1, 4, 27, 256, 3125]
- 切片:即截取列表的部分相鄰元素。通過指定要截取的第一個和最后一個索引來進行切片允青,并得到一個新的列表卵沉。依然符合差一行為史汗。
nums = list(range(1, 11))
# 實際上是從索引1到4
print(nums[1:5]) # [2, 3, 4, 5]
# 沒有指定開始索引會默認從0開始 沒指定結(jié)束索引會默認到列表最后一個元素結(jié)束
print(nums[:5]) # [1, 2, 3, 4, 5]
print(nums[5:]) # [6, 7, 8, 9, 10]
print(nums[:]) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 也支持負索引
print(nums[-3:]) # [8, 9, 10]
- 列表的復(fù)制:列表的復(fù)制可以直接使用切片的方式瓷蛙,不能直接將變量賦值給另一個變量艰猬,這和java中的概念(list.addAll)是相同的埋市。
# 這樣相當于將變量nums和nums_2都關(guān)聯(lián)到了同一個列表道宅,不是復(fù)制
nums = [1, 2, 3]
nums_2 = nums
nums_2.append(4)
print(nums_2) # [1, 2, 3, 4]
print(nums) # [1, 2, 3, 4]
# 可以用切片來達到復(fù)制列表的目的
nums = [1, 2, 3]
nums_2 = nums[:]
nums_2.append(4)
print(nums_2) # [1, 2, 3, 4]
print(nums) # [1, 2, 3]
元組
python將不可修改的值稱為不可變的污茵,而不可變的列表稱為元組省咨。
- 元組使用圓括號標識,除了元素不可變之外穷缤,可以向操作列表一樣遍歷津肛、操作元組身坐。
# 元組:不可變的列表
nums = (1, 2, 3)
print(nums) # (1, 2, 3)
print(nums[-2:]) # (2, 3)
if語句
語法同大多數(shù)編程語言落包,僅僅是書寫格式不同部蛇。
- 條件判斷:
- 區(qū)分大小寫,如果不想?yún)^(qū)分大小寫判斷是否相等咐蝇,可以先都轉(zhuǎn)換成小寫再判斷涯鲁。
- 支持==、>有序、<抹腿、>=、<=旭寿、!=判斷。
- 多個判斷條件可以使用and和or關(guān)鍵字盅称,效果等于java中的&&和||肩祥。
- 判斷元素是否包含在某個列表中時,可以使用in和not in關(guān)鍵字微渠。
- python在進行條件判斷時搭幻,會將非空的字符串或列表認為True,反之為False逞盆。
a = "a"
b = "A"
if a == b: # a.lower() == b.lower()
print("a == b")
elif a.lower() == b.lower():
print("a.lower() == b.lower()")
else:
print(False)
nums = [1, 2, 3]
nums_2 = [3, 4, 5]
if (3 in nums) and (3 not in nums_2): # False
print(True)
else:
print(False)
nums = []
a = "a"
if nums: # a
print("nums")
elif a:
print("a")
else:
print(False)
字典
在Python中,字典是一系列鍵--值對 松申。每個鍵都與一個值相關(guān)聯(lián)云芦,你可以使用鍵來訪問與之相關(guān)聯(lián)的值。與鍵相關(guān)聯(lián)的值可以是數(shù)字贸桶、字符串舅逸、列表乃至字典。事實上皇筛,可將任何Python對象用作字典中的值琉历。類似于java中的Map。
- python中,字典用花括號來標識旗笔,每一個鍵值對之間以逗號分隔彪置。
student = {"name": "Allen", "age": 15}
- 可以通過字典的鍵來訪問與之關(guān)聯(lián)的值。
- 字典是一種動態(tài)結(jié)構(gòu)蝇恶,可隨時在其中添加拳魁、修改鍵值對,只需指定字典的鍵即可撮弧。
- 可以通過del語句刪除字典中的鍵值對潘懊。
student = {"name": "Allen", "age": 15}
print(student["name"]) # Allen
student["name"] = "Lili"
print(student) # {'name': 'Lili', 'age': 15}
student["address"] = "ChangSha"
print(student) # {'name': 'Lili', 'age': 15, 'address': 'ChangSha'}
del student["address"]
print(student) # {'name': 'Lili', 'age': 15}
- 可以通過for循環(huán)遍歷字典的所有鍵、所有值或者是所有的鍵值對贿衍。但是不保證遍歷順序和存儲順序相同授舟。
student = {'name': 'Lili', 'age': 15, 'address': 'ChangSha'}
for k, v in student.items():
print(str(k) + ":" + str(v))
for k in student.keys(): # 遍歷字典時會默認遍歷key,因此等效于 for k in student:
print(k)
for v in set(student.values()): # 如果需要去重的話贸辈,可以使用集合set岂却,類似于列表,但每個元素都是獨一無二的
print(v)
while循環(huán)
基本語法同大多數(shù)編程語言裙椭,僅書寫格式不同躏哩。
nums = [1, 1, 1, 1, 2, 2, 1, 3]
while 1 in nums:
nums.remove(1)
print(nums) # [2, 2, 3]
函數(shù)
- 函數(shù)用關(guān)鍵詞def定義,函數(shù)體依然采用縮進方式揉燃。
- 函數(shù)的說明文檔用三引號注釋扫尺,寫在函數(shù)體的第一行。
def print_hello():
"""打招呼"""
print("Hello")
print_hello() # Hello
- 參數(shù)傳遞:python中實參的傳遞有三種方式:位置實參炊汤,關(guān)鍵字實參和默認值正驻。位置實參即基于實參的順序依次傳遞,這是大多數(shù)編程語言中的一種普遍做法抢腐。關(guān)鍵字實參通過鍵值對的方式傳遞參數(shù)姑曙,不用考慮參數(shù)的順序。默認值即在編寫函數(shù)時為形參指定一個默認值迈倍,調(diào)用函數(shù)時如果不指定實參伤靠,則使用此默認值。注意如果不指定默認值啼染,則調(diào)用函數(shù)時必須傳入該實參宴合。
def print_hello(name, age="15"):
"""打招呼"""
print("你好,我叫" + str(name) + "迹鹅," + str(age) + "歲")
print_hello("李狗蛋", "12") # 你好卦洽,我叫李狗蛋,12歲
print_hello("12", "李狗蛋") # 你好斜棚,我叫12阀蒂,李狗蛋歲
print_hello(age="12", name="李狗蛋") # 你好该窗,我叫李狗蛋,12歲
# 形參可以有默認值蚤霞,相當于簡化了java中的方法的多態(tài)
print_hello("李狗蛋") # 你好酗失,我叫李狗蛋,15歲
- 返回值:python中函數(shù)可以通過關(guān)鍵字return返回一個值争便,且python是弱類型語言级零,無需指定返回的值的類型。
- 列表作為實參傳入時滞乙,如果函數(shù)內(nèi)部對該列表做了修改奏纪,則原列表也會改變,這一點同java是一樣的斩启。如果不想修改原列表序调,可以將列表的一個副本作為實參傳入,比如使用切片兔簇。
def getList(list):
list[0] = 2
return list
a = [1, 2]
print(getList(a)) # [2, 2]
print(a) # [2, 2]
a = [1, 2]
print(getList(a[:])) # [2, 2]
print(a) # [1, 2]
- 函數(shù)可以使用 *+形參名 的形式添加任意數(shù)量的參數(shù)(相當于在函數(shù)內(nèi)部发绢,將可變參數(shù)組成了一個tuple),類似于java中的 形參名+... 符號垄琐,如果有多個不同類型的形參边酒,這種接收任意數(shù)量參數(shù)的形參只能放在最后。
def muti(*name): # 形參名*name 中的星號讓Python創(chuàng)建一個名為name 的空元組狸窘,并將收到的所有值都封裝到這個元組中墩朦。
print(name)
muti("a") # ('a',)
muti("a", "b", "c") # ('a', 'b', 'c')
- 函數(shù)可以通過兩個星號來接收任意數(shù)量的關(guān)鍵字實參(鍵值對,相當于在函數(shù)內(nèi)部翻擒,將可變關(guān)鍵字參數(shù)組成了一個dict)氓涣。
def person(name, age, **other): # 形參名**other 中的星號讓Python創(chuàng)建一個名為other 的空字典,并將收到的所有鍵值對都封裝到這個字典中陋气。
p = {"name": name, "age": age}
for k, v in other.items():
p[k] = v
print(other)
person("Allen", 15, sex="man", address="ChangSha") # {'name': 'Allen', 'age': 15, 'sex': 'man', 'address': 'ChangSha'}
如果要限制關(guān)鍵字參數(shù)的名字劳吠,就可以用命名關(guān)鍵字參數(shù),例如巩趁,只接收city和score作為關(guān)鍵字參數(shù)痒玩。這種方式定義的函數(shù)如下:
def person(name, age, *, address, score):
print(name, age, address, score)
person("Allen", 15, address='Beijing', score=98)
和關(guān)鍵字參數(shù) ** other不同,命名關(guān)鍵字參數(shù)需要一個特殊分隔符* 晶渠,*后面的參數(shù)被視為命名關(guān)鍵字參數(shù)凰荚。
- 在Python中定義函數(shù),可以用必選參數(shù)褒脯、默認參數(shù)、可變參數(shù)缆毁、關(guān)鍵字參數(shù)和命名關(guān)鍵字參數(shù)番川,這5種參數(shù)都可以組合使用。但是請注意,參數(shù)定義的順序必須是:必選參數(shù)颁督、默認參數(shù)践啄、可變參數(shù)、命名關(guān)鍵字參數(shù)和關(guān)鍵字參數(shù)沉御。
- 導(dǎo)入外部函數(shù):要讓函數(shù)是可導(dǎo)入的屿讽,得先創(chuàng)建模塊。模塊是擴展名為.py的文件吠裆,包含要導(dǎo)入到程序中的代碼伐谈。導(dǎo)入方式:
- import module_name:導(dǎo)入整個模塊。
- import module_name as other_name:為導(dǎo)入的模塊起一個別名试疙。
- from module_name import function_name:導(dǎo)入模塊中的某個函數(shù)诵棵,function_name可以有多個,用逗號隔開祝旷,表示導(dǎo)入該模塊的多個函數(shù)履澳。
- from module_name import function_name as other_name:導(dǎo)入模塊中的某個函數(shù),并起一個別名怀跛,一般原函數(shù)名字太長或者有同名函數(shù)時使用距贷。
- from module_name import *:導(dǎo)入該模塊的全部函數(shù)。
注:只導(dǎo)入模塊時吻谋,需通過module_name.function_name調(diào)用(前兩種方式)忠蝗,導(dǎo)入函數(shù)時,可以直接通過函數(shù)名使用(后三種方式)滨溉。當然什湘,有別名的情況下也可以使用別名。
類
- 通過關(guān)鍵字class標識晦攒,類名的首字母大寫闽撤,采用駝峰命名法,可以在類名的下一行添加注釋文檔脯颜,用三引號標識哟旗。
- python的類有一個特殊的方法__ init__(),每次創(chuàng)建類的實例時都會運行這個方法栋操,類似于java中的構(gòu)造函數(shù)闸餐。在這個方法的名稱中,開頭和末尾各有兩個下劃線矾芙,這是一種約定舍沙,旨在避免Python默認方法與普通方法發(fā)生名稱沖突。
- 形參self必不可少剔宪,還必須位于其他形參的前面拂铡。每個與類相關(guān)聯(lián)的方法調(diào)用都自動傳遞實參self 壹无,它是一個指向?qū)嵗旧淼囊茫寣嵗軌蛟L問類中的屬性和方法感帅。
- 以self 為前綴的變量都可供類中的所有方法使用斗锭,我們還可以通過類的任何實例來訪問這些變量,我們可以將這些以self為前綴的變量稱為屬性失球。
- 以兩個下劃線開頭可以定義類的私有方法和屬性岖是,命名格式為__private_method,self.__private_attrs实苞。
class Person:
"""測試類"""
def __init__(self, name="Allen", age=15, sex="man"):
self.name = name
self.age = age
self.sex = sex
self.address = ""
print("person " + name + " init")
def walk(self):
print(self.name + " can walk.")
def run(self):
self.walk()
print(self.name + " can run too.")
- 繼承豺撑。
class Person:
"""測試類"""
def __init__(self, name, age=15, sex="man"):
self.name = name
self.age = age
self.sex = sex
self.address = ""
print("person " + name + " init")
def walk(self):
print(self.name + " can walk.")
def run(self):
self.walk()
print(self.name + " can run too.")
person = Person("Allen") # person Allen init
person.run() # Allen can walk. Allen can run too.
class Student(Person): # Student繼承于Person
def __init__(self, name): # 子類的__init__方法需要接收父類的所有參數(shù),有默認值的可以不傳硬梁,會取默認值
super().__init__(name) # 子類繼承父類的所有屬性和方法
def walk(self): # 重寫父類方法
print("override function.")
def get_teacher(self, teacher_name): # 子類的自定義方法
print(self.name + "'s teacher is " + teacher_name)
student = Student("Allen") # person Allen init
student.get_teacher("Lili") # Allen's teacher is Lili
student.walk() # override function.
文件讀寫
通過open函數(shù)打開一個文件前硫,進行讀寫操作,完成后通過close函數(shù)關(guān)閉文件荧止,也可以使用with關(guān)鍵字屹电,讓python自己選擇適時關(guān)閉文件。
def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True):
open函數(shù)可以接收一個mode參數(shù)跃巡,包括以下值:
- 'r' 只讀方式打開 (default)
- 'w' 只寫方式打開危号,打開文件會清空文件,再寫入素邪,文件不存在時會自動創(chuàng)建文件外莲。
- 'x' 創(chuàng)建一個新文件并以只寫方式打開
- 'a' 只寫方式打開,打開文件會將寫入內(nèi)容拼接到文件最后兔朦,
- 'b' 字節(jié)模式
- 't' 文本模式(default)
- '+' 打開一個硬盤文件進行更新 (reading and writing)
- 'U' universal newline mode (已過時)
默認模式為"rt"偷线。
讀文件
測試文件 file_io_test:
abcdefg
hijklmn
opq
rst
uvw
xyz
- 讀取整個文件
with open("file_io_test") as file: # 關(guān)鍵字with 在不再需要訪問文件后適時將其關(guān)閉。
print(file.read()) # read()可以接收一個int參數(shù)沽甥,表示讀取的字節(jié)數(shù)声邦,傳-1表示讀取全部,默認值為-1
- 讀取一行
with open("file_io_test") as file:
print(file.readline()) # abcdefg 行末尾有一個換行符
print(file.readline()) # hijklmn
- 讀取每行摆舟,并存儲到一個列表
with open("file_io_test") as file:
print(file.readlines()) # ['abcdefg\n', 'hijklmn\n', 'opq\n', 'rst\n', 'uvw\n', 'xyz']
- 逐行讀取
with open("file_io_test") as file:
for line in file: # 等同于line = file.readline()
print(line)
- 是否可讀
with open("file_io_test") as file:
print(file.readable()) # readable()是否可讀亥曹,返回一個布爾值
寫文件
with open("file_write_test", mode="w+") as file: # w換成a后可以附加到文件中,不會覆蓋
file.write("456") # 寫入456
print(file.readable()) # True
異常
處理異常:
def divide(a, b):
"""除法運算"""
try:
result = a / b
except ZeroDivisionError:
print("除數(shù)不能為0")
else:
print(result)
finally:
print("運行完畢")
divide(1, 0) # 除數(shù)不能為0 運行完畢
divide(1, 5) # 0.2 運行完畢
存儲數(shù)據(jù)
通過json存儲
import json
nums = [1, 2, 3, 4, 5]
with open("jsonTest.json", "w") as file:
json.dump(nums, file) # 寫入文件恨诱,接收一個內(nèi)容對象和文件對象
with open("jsonTest.json") as file:
result = json.load(file)
print(result)