讓你的代碼更賞心悅目,介紹10個重要的Python技巧
導(dǎo)讀:
Python可以說是近5年來增長速度最快、應(yīng)用最廣泛的,并且是世界范圍內(nèi)最受歡迎的編程語言之一;
今天,我來給大家講講10個我個人覺得非常實用,但并不是所有人都知道的Python編程技巧;
保持這些良好的編程習(xí)慣,可以讓我們寫出更清晰、更優(yōu)雅、更易讀、更加賞心悅目的代碼;
Python語言在設(shè)計之初,其實就有在考慮他語法的簡潔性和可讀性;
可能有人聽說過Python之禪(Zen of Python);
這其實是Tim Peter在Python中留下的一個彩蛋;
如果你進入Python,輸入Import this,你會看到作者留下的一條條編程建議,其中列出的這20條規(guī)則,就是在告訴你Python程序編寫的指導(dǎo)方針;
另外,不知道大家有沒有聽說過Pythonic這個詞,他其實也是指的是Python具有獨特風(fēng)格、簡潔而優(yōu)雅的代碼;
最后,甚至在Python語言的提案PEP8中,也定義了一條條讓代碼更清晰、更簡潔的代碼規(guī)范;
這里我篩選出10個重要的技巧,這里就用實例一一講解一些吧:
一、變量的交換
- a = 1
- b = 2
- 如果我們需要交換a 和 b中的內(nèi)容
- 我們通常可以定義一個臨是變量tmp
- tmp = a
- a = b
- b = tmp
先將a 的內(nèi)容存放在其中,然后將a 設(shè)置成b,再將b 設(shè)置成這個臨時的變量;
不過上面這段代碼其實在Python中可以被改寫成這樣:這樣的話,程序的可讀性就提高了很多;
- a = 1
- b = 2
- a, bb = b, a
二、字符串的格式化
- name = "Chan"
- print("Hi, I'm" + name)
通常我們在程序中需要組合或拼接字符串的話,我們用加號來做字符串的連接,如果做兩個字符串的連接,這樣做其實并沒有什么問題,但如果字符串比較多的話,類似這種情況:
- name = "Chan"
- country = "China"
- age = 23
- print("Hi, I'm " + name + ". I'm from " + country + ". And I'm " + str(age) + "."
這樣的程序就會顯得非常的雜亂并且不易閱讀;而且,當(dāng)我們在連接整形數(shù)據(jù)的時候,還需要進行類型的轉(zhuǎn)化,不然程序會報錯。
其實,我們可以把程序?qū)懗蛇@個樣子,利用Python的百分號語法來格式化字符串,其中%s代表這里會被替代成一個字符串,%d表示這里會被替換成一個替換成一個十進制,最后面括號內(nèi)里的內(nèi)容表示會被替換的內(nèi)容:
- name = "Chan"
- country = "China"
- age = 23
- print("Hi, I'm %s. I'm from %s. And I'm %d." % (name,country,age))
雖然程序?qū)懗蛇@樣已經(jīng)好看很多了,但是我們在這里還可以做的更好一些,我們可以利用python中的format函數(shù)和花括號語法,把程序?qū)懗上旅孢@樣:
花括號里面的內(nèi)容會被替換成format函數(shù)中傳入的各個參數(shù);
- name = "Chan"
- country = "China"
- age = 23
- print("Hi, I'm {}. I'm from {}. And I'm {}.".format (name,country,age))
花括號里面的內(nèi)容會被替換成format函數(shù)中傳入的各個參數(shù),使用這個函數(shù)好處是:
你可以在花括號中寫入被替代的索引,同個索引的地方會被替換成同一個內(nèi)容,像下面這樣:
- name = "Chan"
- print("Hi, I'm {0}. And I'm {0}.".format (name))
- 結(jié)果:Hi, I'm Chan. And I'm Chan
最后一種,也是我最喜歡的,叫做f-string,我們只需要在字符串開頭寫一個f,花括號中的內(nèi)容就會被自動替換成指定表達式的值,注意是表達式:
- name = "Chan"
- country = "China"
- age = 23
- print(f"Hi, I'm {name}. I'm from {country}. And I'm {age+1}."
三、Python中Yield語法
比如在這里,我們定義了一個fibonacci()函數(shù),來列舉斐波那契數(shù)列的前n位:0、1、1、2、3、5...
- def fibonacci(n):
- a = 0
- b = 1
- nums = []
- for _ in range(n):
- nums.appends(a)
- a, bb = b, a+b
- return nums
- for i in fibonacci(10):
- print(i)
我們可以修改這個fibonacci()函數(shù)來使用Python中的yield語法:
首先把append改寫成yield;
然后刪除num列表;
這樣程序會和以上是一樣的,yield a表示,每當(dāng)我們計算出一個元素,就立馬將這個元素送出去;并不需要等整個列表生成后再輸出;yield的優(yōu)勢是在一些非常耗時的操作,及時輸出;
- def fibonacci(n):
- a = 0
- b = 1
- for _ in range(n):
- yield a
- a, bb = b, a+b
- return nums
- for i in fibonacci(10):
- print(i)
四、列表解析式
比如我們有一系列水果的名字,存放在fruit列表里,如果我們希望把列表的內(nèi)容都改成大寫,我們可以有很多種辦法:
- fruit = ["apple", "pear", "orange", "banana"]
- 第一種:
- for i in range(len(fruit)):
- fruit[i] = fruit[i].upper()
- 更簡單的語法:
- fruit = [x.upper for x in fruit]
方括號中for后面內(nèi)容是告訴python,我們需要枚舉fruit變量中的所有元素,而其中每個元素名稱叫做x,前半部分則是將x大寫upper().
做個練習(xí),評論區(qū)可以說說這段代碼是什么意思:
- fruit = ["apple", "pear", "orange", "banana"]
- new_fruit = [x for x in fruit if x.startwith("a")]
五:Enumerate函數(shù)
使用4的例子,我們希望按順序輸出一個列表中的所有元素,我們可以使用下面方式:
- fruit = ["apple", "pear", "orange", "banana"]
- for x in fruit:
- print(x)
如果我們希望得到每個值對用的索引值,比如apple是0,orange是2,我們可以使用Enumerate函數(shù),把程序改成這樣:
- fruit = ["apple", "pear", "orange", "banana"]
- for i,x in enumerate(fruit):
- print(i,x)
- i是索引值,x是內(nèi)容值
六、反向遍歷
如果我們希望對列表從后往前依次輸出,那么應(yīng)該怎么做呢?
其實只要加入reversed函數(shù)就可以了:
- fruit = ["apple", "pear", "orange", "banana"]
- for i,x in enumerate(reversed(fruit)):
- print(i,x)
希望水果元素按照字母順序輸出,使用sorted函數(shù):
- fruit = ["apple", "pear", "orange", "banana"]
- for i,x in enumerate(sorted(fruit)):
- print(i,x)
七、字典的合并操作
比如我們有兩個字典,存放不同用戶的用戶名和密碼,可以寫一個程序,將兩個字典合并:
- a = {"ross":"123456","xiaoming":"xiao123"}
- b = {"lili":"11111","nana":"123456"}
- c = {}
- for k in a :
- c[k] = a[k]
- for k in b:
- c[k] = b[k]
我們可以將程序改寫成:
- a = {"ross":"123456","xiaoming":"xiao123"}
- b = {"lili":"11111","nana":"123456"}
- c = {**a, **b}
兩個**號在python中稱為解包unpacking,意為將a和b的內(nèi)容都直接放入c中;
八、三元運算符:
我們經(jīng)常會根據(jù)條件,將變量設(shè)置成不同的值:
- if score > 60:
- s = "pass"
- else:
- s = "fail"
其實可以直接改成:
- s = "pass" if score > 60 else "fail"
這里的if...else稱為Python中的三元運算符;
九、序列解包
我們定義一個變量,存儲名字的名和姓,如果我們想要單獨提取他們的姓和名,并存入不同變量,我們最簡單的辦法就是使用split()函數(shù):
- Name = "Xiao Chen"
- str_list = name.split()
- first_name = str_list[0]
- last_name = str_list[1]
其實這段代碼可以被改寫成:
- Name = "Xiao Chen"
- first_name,last_name = name.split()
我們直接將split()函數(shù)返回列表中的元素賦給first_name和last_name,這個操作在python中就被稱為序列解包,這里的序列不一定是列表,可以是元組,甚至是range;
十、With語句
如果我們想打開某個文件,我們可以使用open函數(shù),打開并讀取文件;
讀取后不要忘記關(guān)閉文件,如果不關(guān)閉,Python將一直占用這個文件的資源,直到程序退出為止;
- f = open("suchfils.txt", "r")
- s = f.read()
- f.close()
對于小腳本來說,這不是什么大事,但是,對于一個長時間在服務(wù)器運行的程序,系統(tǒng)資源很可能被吃光,系統(tǒng)程序就會崩潰;所以更好的習(xí)慣是使用Python的with語句,將程序改寫成:
- with open("suchfils.txt", "r") as f:
- s = f.read()
這樣的話,就不用調(diào)用close函數(shù)了,執(zhí)行完,文件就會自動關(guān)閉;
今天主要講了Python的一些小技巧,有興趣可以一起交流~