程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python 小貼士(3)

編輯:Python

19. 不要把函數返回的多個數值拆分到三個以上的變量中

拆包機制允許 Python 函數返回一個以上的值:

def get_stats(numbers): minimum = min(numbers) maximum = max(numbers) return minimum, maximumlengths = [63, 73, 72, 60, 67, 66, 71, 61, 72, 70]minimum, maximum = get_stats(lengths)print(f'Min: {minimum}, Max: {maximum}')>>>Min: 60, Max: 73

在返回多個值的時候,可以用帶星號的表達式接收那些沒有被普通變量捕獲到的值。

def get_avg_ratio(numbers): average = sum(numbers) / len(numbers) scaled = [x / average for x in numbers] scaled.sort(reverse=True) return scaledlongest, *middle, shortest = get_avg_ratio(lengths)print(f'Longest: {longest:>4.0%}')print(f'Shortest: {shortest:>4.0%}')>>>Longest: 108%Shortest: 89%

20. 遇到意外情況時應該拋出異常,不要返回 None

def careful_devide(a, b): try: return a / b except ZeroDivisionError: raise ValueError('Invalid inputs')x, y = 5, 2try: result = careful_devide(x, y)except ValueError: print('Invalid inputs')else: print('Result is %.1f' % result)>>>Result is 2.5

21. 了解如何在閉包裡面使用外圍作用域中的變量

Python 支持閉包,這讓定義在大函數中的小函數也能應用大函數的變量。函數在 Python 中時一等對象,所以可以像操作其他對象那樣直接引用它們、把它們賦給變量、將他們當成參數傳給其他函數。Python 在判斷兩個序列(包括元組)的大小時,首先比較 0 號位置的兩個元素,如果相等,就比較 1 號位置的兩個元素,如果還相等,就比較 2 號位置的兩個元素,依此類推,直到得出結論為止。
Python 有一種特殊的寫法,可以把閉包中的數據賦給閉包外面的變量。

def sort_priority(numbers, group): found = False def helper(x): nonlocal found if x in group: found = True return (0, x) return (1, x) numbers.sort(key=helper) return found

22. 用數量可變的位置參數給函數設計清晰的參數列表

def log(message, *values): if not values: print(message) else: values_str = ', '.join(str(x) for x in values) print(f'{message}: {values_str}')log('My numbers are', 1, 2)log('Hi there')>>>My numbers are: 1, 2Hi therefavorites = [7, 33, 99]log('Favorite colors', *favorites)>>>Favorite colors: 7, 33, 99

23. 用關鍵字參數來表示可選的行為

def remainder(number, divisor): return number % divisor# 以下四種效果相同remainder(20, 7)remainder(20, divisor=7)remainder(number=20, divisor=7)remainder(divisor=7, number=20)

如果位置參數和關鍵字參數混用,位置參數必須出現在關鍵字參數之前。
如果有一個字典,且 remainder 函數可以調用這個字典,那麼可以把 ** 加在字典前面,這會讓 Python 把字典裡的鍵值對以關鍵字參數的形式傳給函數。

my_kwargs = { 'number': 20, 'divisor': 7,}remainder(**my_kwargs)my_kwargs = { 'divisor': 7,}remainder(number=20, **my_kwargs)my_kwargs = { 'number': 20,}other_kwargs = { 'divisor': 7,}remainder(**my_kwargs, **other_kwargs)

用關鍵字參數調用函數可以讓初次閱讀代碼的人更容易看懂。可以帶有默認值,該值是在定義函數時指定的。可以靈活地擴充函數的參數。

24. 用 None 和 docstring 來描述默認值會變的參數

def log(message, when=None): if when is None: when = datatime.now() print(f'{when}: {message}')
def decode(data, default=None): try: return json.loads(data) except ValueError: if default is None: default = {} return default

25. 用只能以關鍵字指定和只能按位置傳入的參數來設計清晰的參數列表

def safe_division_e(numerator, denominator, /, ndigits=10, *, ignore_overflow=False, ignore_zero_division=False): try: fraction = numerator / denominator return round(fraction, ndigits) except OverflowError: if ignore_overflow: return 0 else: raise except ZeroDivisionError: if ignore_zero_division: return float('inf') else: raise

在函數的參數列表中,/ 符號左側的參數是只能按位置指定的參數,* 符號右側的參數則是只能按關鍵字形式指定的參數。這兩個符號之間的參數既可以按位置提供,又可以用關鍵字形式指定。

26. 用 functools.wraps 定義函數修飾器

這是個很有用的機制,能夠確保用戶以正確的方式使用函數,也能夠用來調試程序或實現函數注冊功能,此外還有許多用途。

from functools import wrapsdef trace(func): @wraps(func) def wrapper(*args, **kwargs): result = func(*args, **kwargs) print(f'{func.__name__}({args!r}, {kwargs!r}) ' f'-> {result!r}') return result return [email protected] fibonacci(n): """Return the n-th Fibonacci number""" if n in (0, 1): return n return (fibonacci(n - 2) + fibonacci(n - 1))help(fibonacci)>>>Help on function fibonacci in module __main__:fibonacci(n) Return the n-th Fibonacci number

作者:yspg_217

游戲編程,一個游戲開發收藏夾~

如果圖片長時間未顯示,請使用Chrome內核浏覽器。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved