成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一些你可能不知道的Python小技巧!

開發(fā) 后端
在本文中,我們來看一看日常工作中經(jīng)常使用的一些 Python 小技巧。

 

本文中,我們來看一看日常工作中經(jīng)常使用的一些 Python 小技巧。

集合

開發(fā)人員常常忘記 Python 也有集合數(shù)據(jù)類型,大家都喜歡使用列表處理一切。

集合(set)是什么?簡單來說就是:集合是一組無序事物的匯集,不包含重復(fù)元素。

如果你熟練掌握集合及其邏輯,那么很多問題都可以迎刃而解。舉個例子,如何獲取一個單詞中出現(xiàn)的字母? 

  1. myword = "NanananaBatman"  
  2. set(myword)  
  3. {'N', 'm', 'n', 'B', 'a', 't'} 

就這么簡單,問題解決了,這個例子就來自 Python 的官方文檔,大可不必過于驚訝。

再舉一個例子,如何獲取一個列表的各個元素,且不重復(fù)? 

  1. # first you can easily change set to list and other way around  
  2. mylist = ["a", "b", "c","c"]  
  3. # let's make a set out of it  
  4. myset = set(mylist)  
  5. # myset will be:  
  6. {'a', 'b', 'c'}  
  7. # and, it's already iterable so you can do:  
  8. for element in myset:  
  9.     print(element)  
  10. # but you can also convert it to list again: 
  11.  mynewlist = list(myset)  
  12. # and mynewlist will be: 
  13. ['a', 'b', 'c'] 

我們可以看到,“c”元素不再重復(fù)出現(xiàn)了。只有一個地方你需要注意,mylist 與 mynewlist 之間的元素順序可能會有所不同: 

  1. mylist = ["c", "c", "a","b"]  
  2. mynewlist = list(set(mylist)) 
  3. # mynewlist is:  
  4. ['a', 'b', 'c'] 

可以看出,兩個列表的元素順序不同。

下面,我們來進(jìn)一步深入。

假設(shè)某些實(shí)體之間有一對多的關(guān)系,舉個更加具體的例子:用戶與權(quán)限。通常,一個用戶可以擁有多個權(quán)限。現(xiàn)在假設(shè)某人想要修改多個權(quán)限,即同時添加和刪除某些權(quán)限,應(yīng)當(dāng)如何解決這個問題? 

  1. # this is the set of permissions before change;  
  2. original_permission_set = {"is_admin","can_post_entry", "can_edit_entry", "can_view_settings"}  
  3. # this is new set of permissions;  
  4. new_permission_set = {"can_edit_settings","is_member", "can_view_entry", "can_edit_entry"}  
  5. # now permissions to add will be:  
  6. new_permission_set.difference(original_permission_set)  
  7. # which will result:  
  8. {'can_edit_settings', 'can_view_entry', 'is_member'}  
  9. # As you can see can_edit_entry is in both sets; so we do notneed  
  10. # to worry about handling it  
  11. # now permissions to remove will be:  
  12. original_permission_set.difference(new_permission_set)  
  13. # which will result:  
  14. {'is_admin', 'can_view_settings', 'can_post_entry'}  
  15. # and basically it's also true; we switched admin to member, andadd  
  16. # more permission on settings; and removed the post_entrypermission 

總的來說,不要害怕使用集合,它們能幫助你解決很多問題,更多詳情,請參考 Python 官方文檔。

日歷

當(dāng)開發(fā)與日期和時間有關(guān)的功能時,有些信息可能非常重要,比如某一年的這個月有多少天。這個問題看似簡單,但是我相信日期和時間是一個非常有難度的話題,而且我覺得日歷的實(shí)現(xiàn)問題非常多,簡直就是噩夢,因?yàn)槟阈枰紤]大量的極端情況。

那么,究竟如何才能找出某個月有多少天呢? 

  1. import calendar  
  2. calendar.monthrange(2020, 12)  
  3. # will result:  
  4. (1, 31)  
  5. # BUT! you need to be careful here, why? Let's read thedocumentation:  
  6. help(calendar.monthrange)  
  7. # Help on function monthrange in module calendar:  
  8. # monthrange(year, month)  
  9. #     Return weekday (0-6~ Mon-Sun) and number of days (28-31) for  
  10. #    year, month.  
  11. # As you can see the first value returned in tuple is a weekday,  
  12. # not the number of the first day for a given month; let's try  
  13. # to get the same for 2021  
  14. calendar.monthrange(2021, 12)  
  15. (2, 31)  
  16. # So this basically means that the first day of December 2021 isWed  
  17. # and the last day of December 2021 is 31 (which is obvious,cause  
  18. # December always has 31 days)  
  19. # let's play with February  
  20. calendar.monthrange(2021, 2)  
  21. (0, 28)  
  22. calendar.monthrange(2022, 2)  
  23. (1, 28)  
  24. calendar.monthrange(2023, 2)  
  25. (2, 28)  
  26. calendar.monthrange(2024, 2)  
  27. (3, 29)  
  28. calendar.monthrange(2025, 2)  
  29. (5, 28)  
  30. # as you can see it handled nicely the leap year; 

某個月的第一天當(dāng)然非常簡單,就是 1 號。但是,“某個月的第一天是周X”,如何使用這條信息呢?你可以很容易地查到某一天是周幾: 

  1. calendar.monthrange(2024, 2)  
  2. (3, 29)  
  3. # means that February 2024 starts on Thursday  
  4. # let's define simple helper:  
  5. weekdays = ["Monday", "Tuesday","Wednesday", "Thursday", "Friday","Saturday", "Sunday"]  
  6. # now we can do something like:  
  7. weekdays[3] 
  8. # will result in:  
  9. 'Thursday'  
  10. # now simple math to tell what day is 15th of February 2020:  
  11. offset = 3  # it's thefirst value from monthrange  
  12. for day in range(1, 29):  
  13.     print(day,weekdays[(day + offset - 1) % 7])  
  14. 1 Thursday  
  15. 2 Friday  
  16. 3 Saturday  
  17. 4 Sunday  
  18. ...  
  19. 18 Sunday  
  20. 19 Monday  
  21. 20 Tuesday  
  22. 21 Wednesday  
  23. 22 Thursday  
  24. 23 Friday  
  25. 24 Saturday  
  26. ... 
  27. 28 Wednesday  
  28. 29 Thursday  
  29. # which basically makes sense; 

也許這段代碼不適合直接用于生產(chǎn),因?yàn)槟憧梢允褂?datetime 更容易地查找星期: 

  1. from datetime import datetime  
  2. mydate = datetime(2024, 2, 15)  
  3. datetime.weekday(mydate)  
  4. # will result:  
  5.  
  6. # or:  
  7. datetime.strftime(mydate, "%A")  
  8. 'Thursday' 

總的來說,日歷模塊有很多有意思的地方,值得慢慢學(xué)習(xí): 

  1. # checking if year is leap:  
  2. calendar.isleap(2021)  #False  
  3. calendar.isleap(2024)  #True  
  4. # or checking how many days will be leap days for given yearspan:  
  5. calendar.leapdays(2021, 2026) # 1 
  6. calendar.leapdays(2020, 2026) # 2  
  7. # read the help here, as range is: [y1, y2), meaning that second  
  8. # year is not included;  
  9. calendar.leapdays(2020, 2024) # 1 

枚舉有第二個參數(shù)

是的,枚舉有第二個參數(shù),可能很多有經(jīng)驗(yàn)的開發(fā)人員都不知道。下面我們來看一個例子: 

  1. mylist = ['a', 'b', 'd', 'c', 'g', 'e']  
  2. for i, item in enumerate(mylist):  
  3.     print(i, item)  
  4. # Will give: 
  5. 0 a  
  6. 1 b  
  7. 2 d  
  8. 3 c  
  9. 4 g  
  10. 5 e  
  11. # but, you can add a start for enumeration:  
  12. for i, item in enumerate(mylist, 16):  
  13.     print(i, item)  
  14. # and now you will get:  
  15. 16 a  
  16. 17 b  
  17. 18 d  
  18. 19 c  
  19. 20 g  
  20. 21 e 

第二個參數(shù)可以指定枚舉開始的地方,比如上述代碼中的 enumerate(mylist,16)。如果你需要處理偏移量,則可以考慮這個參數(shù)。

if-else 邏輯

你經(jīng)常需要根據(jù)不同的條件,處理不同的邏輯,經(jīng)驗(yàn)不足的開發(fā)人員可能會編寫出類似下面的代碼: 

  1. OPEN = 1  
  2. IN_PROGRESS = 2  
  3. CLOSED = 3  
  4. def handle_open_status():  
  5.     print('Handling openstatus')  
  6. def handle_in_progress_status():  
  7.     print('Handling inprogress status')  
  8. def handle_closed_status():  
  9.     print('Handling closedstatus')  
  10. def handle_status_change(status):  
  11.     if status == OPEN:  
  12.        handle_open_status()  
  13.     elif status ==IN_PROGRESS:  
  14.         handle_in_progress_status()  
  15.     elif status == CLOSED:  
  16.        handle_closed_status()  
  17. handle_status_change(1)  #Handling open status  
  18. handle_status_change(2)  #Handling in progress status  
  19. handle_status_change(3)  #Handling closed status 

雖然這段代碼看上去也沒有那么糟,但是如果有 20 多個條件呢?

那么,究竟應(yīng)該怎樣處理呢? 

  1. from enum import IntEnum  
  2. class StatusE(IntEnum):  
  3.     OPEN = 1  
  4.     IN_PROGRESS = 2  
  5.     CLOSED = 3  
  6. def handle_open_status():  
  7.     print('Handling openstatus')  
  8. def handle_in_progress_status():  
  9.     print('Handling inprogress status')  
  10. def handle_closed_status():  
  11.     print('Handling closedstatus')  
  12. handlers = {  
  13.     StatusE.OPEN.value:handle_open_status,  
  14.    StatusE.IN_PROGRESS.value: handle_in_progress_status,  
  15.     StatusE.CLOSED.value:handle_closed_status  
  16.  
  17. def handle_status_change(status):  
  18.     if status not inhandlers:  
  19.          raiseException(f'No handler found for status: {status}')  
  20.     handler =handlers[status]  
  21.     handler()  
  22. handle_status_change(StatusE.OPEN.value)  # Handling open status  
  23. handle_status_change(StatusE.IN_PROGRESS.value)  # Handling in progress status  
  24. handle_status_change(StatusE.CLOSED.value)  # Handling closed status  
  25. handle_status_change(4)  #Will raise the exception 

在 Python 中這種模式很常見,它可以讓代碼看起來更加整潔,尤其是當(dāng)方法非常龐大,而且需要處理大量條件時。

enum 模塊

enum 模塊提供了一系列處理枚舉的工具函數(shù),最有意思的是 Enum 和 IntEnum。我們來看個例子: 

  1. from enum import Enum, IntEnum, Flag, IntFlag  
  2. class MyEnum(Enum):  
  3.     FIRST ="first"  
  4.     SECOND ="second"  
  5.     THIRD ="third"  
  6. class MyIntEnum(IntEnum):  
  7.     ONE = 1  
  8.     TWO = 2  
  9.     THREE = 3  
  10. # Now we can do things like:  
  11. MyEnum.FIRST  #<MyEnum.FIRST: 'first'>  
  12. # it has value and name attributes, which are handy:  
  13. MyEnum.FIRST.value  #'first'  
  14. MyEnum.FIRST.name  #'FIRST'  
  15. # additionally we can do things like:  
  16. MyEnum('first')  #<MyEnum.FIRST: 'first'>, get enum by value  
  17. MyEnum['FIRST']  #<MyEnum.FIRST: 'first'>, get enum by name 

使用 IntEnum 編寫的代碼也差不多,但是有幾個不同之處: 

  1. MyEnum.FIRST == "first"  # False  
  2. # but  
  3. MyIntEnum.ONE == 1  # True  
  4. # to make first example to work:  
  5. MyEnum.FIRST.value == "first"  # True 

在中等規(guī)模的代碼庫中,enum 模塊在管理常量方面可以提供很大的幫助。 

  1. enum 的本地化可能有點(diǎn)棘手,但也可以實(shí)現(xiàn),我用django快速演示一下:  
  2. from enum import Enum  
  3. from django.utils.translation import gettext_lazy as _  
  4. class MyEnum(Enum):  
  5.     FIRST ="first" 
  6.      SECOND ="second"  
  7.     THIRD ="third"  
  8.     @classmethod  
  9.     def choices(cls):  
  10.         return [  
  11.             (cls.FIRST.value, _('first')),  
  12.             (cls.SECOND.value, _('second')),  
  13.             (cls.THIRD.value, _('third'))  
  14.          ]  
  15. # And later in eg. model definiton:  
  16. some_field = models.CharField(max_length=10,choices=MyEnum.choices()) 

iPython

iPython 就是交互式 Python,它是一個交互式的命令行 shell,有點(diǎn)像 Python 解釋器。

首先,你需要安裝 iPython: 

  1. pip install ipython 

接下來,你只需要在輸入命令的時候,將 Python 換成 ipython: 

  1. # you should see something like this after you start:  
  2. Python 3.8.5 (default, Jul 28 2020, 12:59:40)  
  3. Type 'copyright', 'credits' or 'license' for more information  
  4. IPython 7.18.1 -- An enhanced Interactive Python. Type '?' forhelp.  
  5. In [1]: 

ipython 支持很多系統(tǒng)命令,比如 ls 或 cat,tab 鍵可以顯示提示,而且你還可以使用上下鍵查找前面用過的命令。更多具體信息,請參見官方文檔。 

 

責(zé)任編輯:龐桂玉 來源: 馬哥Linux運(yùn)維
相關(guān)推薦

2021-11-01 12:10:56

Python技巧代碼

2015-05-07 13:13:27

JavaScript JavaScript

2020-01-29 19:40:36

Python美好,一直在身邊Line

2021-01-05 11:22:58

Python字符串代碼

2021-07-05 05:34:10

Typescript語言開發(fā)

2015-08-13 09:03:14

調(diào)試技巧

2015-04-13 13:21:45

JavaScript JavaScript

2017-02-23 19:42:55

AS Android代碼

2012-11-23 10:57:44

Shell

2024-03-04 00:00:00

Kubernetes技巧API

2022-09-20 11:58:27

NpmNode.js

2019-11-25 14:05:47

Python裝飾器數(shù)據(jù)

2019-11-20 10:25:06

sudoLinux

2022-12-09 15:06:26

字符串Intl字符串分割

2022-12-21 08:05:04

字符串分割技巧

2017-11-07 21:58:25

前端JavaScript調(diào)試技巧

2021-02-28 08:34:14

CSS outline-off負(fù)值技巧

2020-11-03 09:51:04

JavaScript開發(fā) 技巧

2023-02-27 09:20:24

絕對定位CSS

2023-01-29 09:46:47

Dialog彈窗模態(tài)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧美一区二区三区电影 | 欧美一级二级在线观看 | 中文字幕一区在线观看视频 | 国产日韩欧美二区 | 国产精品欧美一区二区三区不卡 | 一区二区三区欧美在线 | 一区网站 | 午夜国产在线 | 国产精品视频久久久 | 欧美激情综合色综合啪啪五月 | 亚洲一区二区三区在线免费观看 | 黄色91在线 | 国产精品久久久久久久免费观看 | 91久久精品国产 | 特级毛片爽www免费版 | 中文字幕91av | 亚洲国产精品久久久久秋霞不卡 | 亚洲精品视频一区 | 蜜桃日韩 | 红桃视频一区二区三区免费 | 91av免费看 | 欧美一区二区另类 | 久久神马 | 九九热精品视频 | a黄在线观看 | 久久精品国产99国产精品 | 久久久精品高清 | 中文字幕在线视频免费视频 | 久久噜噜噜精品国产亚洲综合 | 欧美a在线 | 久久免费精品视频 | 日韩二区 | 8x国产精品视频一区二区 | 久久精品国产a三级三级三级 | 国产电影一区二区在线观看 | 久久大陆| 天天夜碰日日摸日日澡 | 国产亚洲一区二区三区在线观看 | 日韩在线一区二区 | 精品国产黄a∨片高清在线 www.一级片 国产欧美日韩综合精品一区二区 | 国产区一区二区三区 |