拆包機制允許 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%
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
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
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
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)
用關鍵字參數調用函數可以讓初次閱讀代碼的人更容易看懂。可以帶有默認值,該值是在定義函數時指定的。可以靈活地擴充函數的參數。
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
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
在函數的參數列表中,/ 符號左側的參數是只能按位置指定的參數,* 符號右側的參數則是只能按關鍵字形式指定的參數。這兩個符號之間的參數既可以按位置提供,又可以用關鍵字形式指定。
這是個很有用的機制,能夠確保用戶以正確的方式使用函數,也能夠用來調試程序或實現函數注冊功能,此外還有許多用途。
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內核浏覽器。