激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python語法之精妙的十個知識點(裝B語法)

Python語法之精妙的十個知識點(裝B語法)

2020-04-14 10:25天元浪子 Python

本文精心篩選了最能展現 Python 語法之精妙的十個知識點,并附上詳細的實例代碼,需要的朋友可以參考下

Python 是一種代表簡單思想的語言,其語法相對簡單,很容易上手。不過,如果就此小視 Python 語法的精妙和深邃,那就大錯特錯了。本文精心篩選了最能展現 Python 語法之精妙的十個知識點,并附上詳細的實例代碼。如能在實戰中融會貫通、靈活使用,必將使代碼更為精煉、高效,同時也會極大提升代碼B格,使之看上去更老練,讀起來更優雅。

1. for - else

什么?不是 if 和 else 才是原配嗎?No,你可能不知道,else 是個腳踩兩只船的家伙,for 和 else 也是一對,而且是合法的。十大裝B語法,for-else 絕對算得上南無灣!不信,請看:

?
1
2
3
4
5
6
7
8
9
10
>>> for i in [1,2,3,4]:
    print(i)
else:
    print(i, '我是else')
    
1
2
3
4
4 我是else

如果在 for 和 else 之間(循環體內)有第三者 if 插足,也不會影響 for 和 else 的關系。因為 for 的級別比 if 高,else 又是一個攀附權貴的家伙,根本不在乎是否有 if,以及是否執行了滿足 if 條件的語句。else 的眼里只有 for,只要 for 順利執行完畢,else 就會屁顛兒屁顛兒地跑一遍:

?
1
2
3
4
5
6
7
8
9
>>> for i in [1,2,3,4]:
    if i > 2:
        print(i)
else:
    print(i, '我是else')
 
3
4
4 我是else

那么,如何拆散 for 和 else 這對冤家呢?只有當 for 循環被 break 語句中斷之后,才會跳過 else 語句:

?
1
2
3
4
5
6
7
8
>>> for i in [1,2,3,4]:
    if i>2:
        print(i)
        break
else:
    print(i, '我是else')
 
3

2. 一顆星(*)和兩顆星(**)

有沒有發現,星(*)真是一個神奇的符號!想一想,沒有它,C語言還有啥好玩的?同樣,因為有它,Python 才會如此的儀態萬方、風姿綽約、楚楚動人!Python 函數支持默認參數和可變參數,一顆星表示不限數量的單值參數,兩顆星表示不限數量的鍵值對參數。

我們還是舉例說明吧:設計一個函數,返回多個輸入數值的和。我們固然可以把這些輸入數值做成一個list傳給函數,但這個方法,遠沒有使用一顆星的可變參數來得優雅:

?
1
2
3
4
5
6
7
8
>>> def multi_sum(*args):
    s = 0
    for item in args:
        s += item
    return s
 
>>> multi_sum(3,4,5)
12

Python 函數允許同時全部或部分使用固定參數、默認參數、單值(一顆星)可變參數、鍵值對(兩顆星)可變參數,使用時必須按照前述順序書寫。

?
1
2
3
4
5
6
7
8
9
>>> def do_something(name, age, gender='男', *args, **kwds):
    print('姓名:%s,年齡:%d,性別:%s'%(name, age, gender))
    print(args)
    print(kwds)
 
>>> do_something('xufive', 50, '男', 175, 75, math=99, english=90)
姓名:xufive,年齡:50,性別:男
(175, 75)
{'math': 99, 'english': 90}

此外,一顆星和兩顆星還可用于列表、元組、字典的解包,看起來更像C語言:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> a = (1,2,3)
>>> print(a)
(1, 2, 3)
>>> print(*a)
1 2 3
>>> b = [1,2,3]
>>> print(b)
[1, 2, 3]
>>> print(*b)
1 2 3
>>> c = {'name':'xufive', 'age':51}
>>> print(c)
{'name': 'xufive', 'age': 51}
>>> print(*c)
name age
>>> print('name:{name}, age:{age}'.format(**c))
name:xufive, age:51

3. 三元表達式

熟悉 C/C++ 的程序員,初上手 python 時,一定會懷念經典的三元操作符,因為想表達同樣的思想,用python 寫起來似乎更麻煩。比如:

?
1
2
3
4
5
6
7
>>> y = 5
>>> if y < 0:
    print('y是一個負數')
else:
    print('y是一個非負數')
 
y是一個非負數

其實,python 是支持三元表達式的,只是稍微怪異了一點,類似于我們山東人講話。比如,山東人最喜歡用倒裝句:打球去吧,要是不下雨的話;下雨,咱就去自習室。翻譯成三元表達式就是:

打球去吧 if 不下雨 else 去自習室

來看看三元表達式具體的使用:

?
1
2
3
>>> y = 5
>>> print('y是一個負數' if y < 0 else 'y是一個非負數')
y是一個非負數

python 的三元表達式也可以用來賦值:

?
1
2
3
4
>>> y = 5
>>> x = -1 if y < 0 else 1
>>> x
1

4. with - as

with 這個詞兒,英文里面不難翻譯,但在 Python 語法中怎么翻譯,我還真想不出來,大致上是一種上下文管理協議。作為初學者,不用關注 with 的各種方法以及機制如何,只需要了解它的應用場景就可以了。with 語句適合一些事先需要準備,事后需要處理的任務,比如,文件操作,需要先打開文件,操作完成后需要關閉文件。如果不使用with,文件操作通常得這樣:

?
1
2
3
4
5
fp = open(r"D:\jb51\Column\temp\mpmap.py", 'r')
try:
 contents = fp.readlines()
finally:
 fp.close()

如果使用 with - as,那就優雅多了:

?
1
2
>>> with open(r"D:\jb51\Column\temp\mpmap.py", 'r') as fp:
    contents = fp.readlines()

5. 列表推導式

在各種稀奇古怪的語法中,列表推導式的使用頻率應該時最高的,對于代碼的簡化效果也非常明顯。比如,求列表各元素的平方,通常應該這樣寫(當然也有其他寫法,比如使用map函數):

?
1
2
3
4
5
6
7
>>> a = [1, 2, 3, 4, 5]
>>> result = list()
>>> for i in a:
    result.append(i*i)
 
>>> result
[1, 4, 9, 16, 25]

如果使用列表推導式,看起來就舒服多了:

?
1
2
3
4
>>> a = [1, 2, 3, 4, 5]
>>> result = [i*i for i in a]
>>> result
[1, 4, 9, 16, 25]

事實上,推導式不僅支持列表,也支持字典、集合、元組等對象。有興趣的話,可以自行研究。我有一篇博文《一行 Python 代碼能實現什么喪心病狂的功能?》,里面的例子,都是列表推導式實現的。

6. 列表索引的各種騷操作

Python 引入負整數作為數組的索引,這絕對是喜大普奔之舉。想想看,在C/C++中,想要數組最后一個元素,得先取得數組長度,減一之后做索引,嚴重影響了思維的連貫性。Python語言之所以獲得成功,我個人覺得,在諸多因素里面,列表操作的便捷性是不容忽視的一點。請看:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>>> a = [0, 1, 2, 3, 4, 5]
>>> a[2:4]
[2, 3]
>>> a[3:]
[3, 4, 5]
>>> a[1:]
[1, 2, 3, 4, 5]
>>> a[:]
[0, 1, 2, 3, 4, 5]
>>> a[::2]
[0, 2, 4]
>>> a[1::2]
[1, 3, 5]
>>> a[-1]
5
>>> a[-2]
4
>>> a[1:-1]
[1, 2, 3, 4]
>>> a[::-1]
[5, 4, 3, 2, 1, 0]

如果說,這些你都很熟悉,也經常用,那么接下來這個用法,你一定會感覺很神奇:

?
1
2
3
4
5
6
7
8
>>> a = [0, 1, 2, 3, 4, 5]
>>> b = ['a', 'b']
>>> a[2:2] = b
>>> a
[0, 1, 'a', 'b', 2, 3, 4, 5]
>>> a[3:6] = b
>>> a
[0, 1, 'a', 'a', 'b', 4, 5]

7. lambda函數

lambda 聽起來很高大上,其實就是匿名函數(了解js的同學一定很熟悉匿名函數)。匿名函數的應用場景是什么呢?就是僅在定義匿名函數的地方使用這個函數,其他地方用不到,所以就不需要給它取個阿貓阿狗之類的名字了。下面是一個求和的匿名函數,輸入參數有兩個,x和y,函數體就是x+y,省略了return關鍵字。

?
1
2
3
>>> lambda x,y: x+y
<function <lambda> at 0x000001B2DE5BD598>
>>> (lambda x,y: x+y)(3,4) # 因為匿名函數沒有名字,使用的時候要用括號把它包起來

匿名函數一般不會單獨使用,而是配合其他方法,為其他方法提供內置的算法或判斷條件。比如,使用排序函數sorted對多維數組或者字典排序時,就可以指定排序規則。

?
1
2
3
4
5
>>> a = [{'name':'B', 'age':50}, {'name':'A', 'age':30}, {'name':'C', 'age':40}]
>>> sorted(a, key=lambda x:x['name']) # 按姓名排序
[{'name': 'A', 'age': 30}, {'name': 'B', 'age': 50}, {'name': 'C', 'age': 40}]
>>> sorted(a, key=lambda x:x['age']) # 按年齡排序
[{'name': 'A', 'age': 30}, {'name': 'C', 'age': 40}, {'name': 'B', 'age': 50}]

再舉一個數組元素求平方的例子,這次用map函數:

?
1
2
3
4
5
>>> a = [1,2,3]
>>> for item in map(lambda x:x*x, a):
    print(item, end=', ')
 
1, 4, 9,

8. yield 以及生成器和迭代器

yield 這詞兒,真不好翻譯,翻詞典也沒用。我干脆就讀作“一愛得”,算是外來詞匯吧。要理解 yield,得先了解 generator(生成器)。要了解generator,得先知道 iterator(迭代器)。哈哈哈,繞暈了吧?算了,我還是說白話吧。

話說py2時代,range()返回的是list,但如果range(10000000)的話,會消耗大量內存資源,所以,py2又搞了一個xrange()來解決這個問題。py3則只保留了xrange(),但寫作range()。xrange()返回的就是一個迭代器,它可以像list那樣被遍歷,但又不占用多少內存。generator(生成器)是一種特殊的迭代器,只能被遍歷一次,遍歷結束,就自動消失了。總之,不管是迭代器還是生成器,都是為了避免使用list,從而節省內存。那么,如何得到迭代器和生成器呢?

python內置了迭代函數 iter,用于生成迭代器,用法如下:

?
1
2
3
4
5
6
7
8
>>> a = [1,2,3]
>>> a_iter = iter(a)
>>> a_iter
<list_iterator object at 0x000001B2DE434BA8>
>>> for i in a_iter:
    print(i, end=', ')
 
1, 2, 3,

yield 則是用于構造生成器的。比如,我們要寫一個函數,返回從0到某正整數的所有整數的平方,傳統的代碼寫法是這樣的:

?
1
2
3
4
5
6
7
8
>>> def get_square(n):
    result = list()
    for i in range(n):
        result.append(pow(i,2))
    return result
 
>>> print(get_square(5))
[0, 1, 4, 9, 16]

但是如果計算1億以內的所有整數的平方,這個函數的內存開銷會非常大,這是 yield 就可以大顯身手了:

?
1
2
3
4
5
6
7
8
9
10
11
>>> def get_square(n):
    for i in range(n):
        yield(pow(i,2))
 
>>> a = get_square(5)
>>> a
<generator object get_square at 0x000001B2DE5CACF0>
>>> for i in a:
    print(i, end=', ')
 
0, 1, 4, 9, 16,

如果再次遍歷,則不會有輸出了。

9. 裝飾器

剛弄明白迭代器和生成器,這又來個裝飾器,Python 咋這么多器呢?的確,Python 為我們提供了很多的武器,裝飾器就是最有力的武器之一。裝飾器很強大,我在這里嘗試從需求的角度,用一個簡單的例子,說明裝飾器的使用方法和制造工藝。

假如我們需要定義很多個函數,在每個函數運行的時候要顯示這個函數的運行時長,解決方案有很多。比如,可以在調用每個函數之前讀一下時間戳,每個函數運行結束后再讀一下時間戳,求差即可;也可以在每個函數體內的開始和結束位置上讀時間戳,最后求差。不過,這兩個方法,都沒有使用裝飾器那么簡單、優雅。下面的例子,很好地展示了這一點。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>>> import time
>>> def timer(func):
    def wrapper(*args,**kwds):
        t0 = time.time()
        func(*args,**kwds)
        t1 = time.time()
        print('耗時%0.3f'%(t1-t0,))
    return wrapper
 
>>> @timer
def do_something(delay):
    print('函數do_something開始')
    time.sleep(delay)
    print('函數do_something結束')
 
    
>>> do_something(3)
函數do_something開始
函數do_something結束
耗時3.077

timer() 是我們定義的裝飾器函數,使用@把它附加在任何一個函數(比如do_something)定義之前,就等于把新定義的函數,當成了裝飾器函數的輸入參數。運行 do_something() 函數,可以理解為執行了timer(do_something) 。細節雖然復雜,不過這么理解不會偏差太大,且更易于把握裝飾器的制造和使用。

10. 巧用斷言assert

所謂斷言,就是聲明表達式的布爾值必須為真的判定,否則將觸發 AssertionError 異常。嚴格來講,assert是調試手段,不宜使用在生產環境中,但這不影響我們用斷言來實現一些特定功能,比如,輸入參數的格式、類型驗證等。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>>> def i_want_to_sleep(delay):
    assert(isinstance(delay, (int,float))), '函數參數必須為整數或浮點數'
    print('開始睡覺')
    time.sleep(delay)
    print('睡醒了')
 
    
>>> i_want_to_sleep(1.1)
開始睡覺
睡醒了
>>> i_want_to_sleep(2)
開始睡覺
睡醒了
>>> i_want_to_sleep('2')
Traceback (most recent call last):
 File "<pyshell#247>", line 1, in <module>
 i_want_to_sleep('2')
 File "<pyshell#244>", line 2, in i_want_to_sleep
 assert(isinstance(delay, (int,float))), '函數參數必須為整數或浮點數'
AssertionError: 函數參數必須為整數或浮點數

關于Python語法之精妙的十個知識點的相關文章就介紹到這了,希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/xufive/article/details/102856921

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 久综合色 | 98色视频 | 美国黄色毛片女人性生活片 | 国产精品嘿咻嘿咻在线播放 | 99精品国产一区二区三区 | 国产成人自拍视频在线观看 | 青青草成人免费视频在线 | 久久久久久中文字幕 | 色的综合| 成人免费电影在线观看 | 黄色va视频 | 黄污网站在线观看 | 欧美大片一级毛片 | 国产精品久久久乱弄 | av资源在线天堂 | 黄色片网站免费在线观看 | 欧美一区二区三区免费不卡 | 孕妇体内谢精满日本电影 | 久久精品视频日本 | 亚洲国产网站 | 玖草 | 久久色网站| 国产精品成人一区二区三区吃奶 | 精品一区二区久久久久久久网精 | 国产高清片| 欧洲精品色| 永久免费av片在线观看全网站 | 亚洲成人国产 | 一起草av在线 | 亚洲白嫩在线观看 | 九九热在线精品视频 | 91中文在线 | 欧美伦理一区二区 | 亚洲精品一区二区三区大胸 | 色淫湿视频 | 欧美一级电影网站 | 中国妞xxxhd露脸偷拍视频 | 性猛交ⅹxxx乱巴西 asian超清日本肉体pics | 欧美日韩在线中文字幕 | 精品一区二区免费 | 午夜视频在线免费观看 |