今天主要分享函數的通常的應用場景,這裏給你們分爲初級一些的應用場景,以及高級的應用場景。還有一種特殊的函數形式——lambda表達式python
以前咱們學過了不少的數據類型,其中容器類型的有集合、字典、列表等,而函數也能夠做爲元素放進這些容器類型的數據類型面試
函數能夠放在集合裏,也能夠放在字典裏,在字典中的時候通常做爲字典的值閉包
def func(): print(123) def bar(): print(666) info = {'k1': func, 'k2': bar} info['k1']() info['k2']()
函數名當變量來使用app
def func(): print(1,2,3) x = func() print(x) lis = [func(),func(),func()] print(lis)
def func(): print(123) func_list = [func, func, func] # func_list[0]() # func_list[1]() # func_list[2]() for item in func_list: v = item() print(v) # 123 None 123 None 123 None
def func(): print(123) def bar(): print(666) info = {'k1': func, 'k2': bar} info['k1']() info['k2']() # 123 666
混淆:dom
def func(): return 123 func_list1 = [func,func,func] func_list2 = [func(),func(),func()] print(func_list1) # [<function func at 0x000002C1829BBA60>, <function func at 0x000002C1829BBA60>, <function func at 0x000002C1829BBA60>] print(func_list2) #[123, 123, 123]
函數能夠當參數進行傳遞函數
def func(arg): v1 = arg() print(v1) def show(): print(666) func(show) # 666 None
def func(arg): v1 = arg() print(v1) def show(): print(666) result = func(show) print(result) #666 None None
lambda表達式是用來表達簡單的函數,默認有返回值return編碼
def func(a1,a2): return a1+a2 func2 = lambda a1,a2:a1+a2 v = func2(1,2) # 以上的兩種寫法是徹底等價的
輸入兩個數,比較大小,返回大的那個rest
func5 = lambda a,b:a if a>b else b #輸入兩個數,返回其中大的數字 v = func5(3,4)
內置函數code
輸入輸出ip
強制轉換
數字相關
abs() : 絕對值
v = abs(-1) print(v)
float() :浮點型(小數)
v = 55 v1 = float(55) print(v1)
max() :最大值
v = [1,2,311,21,3,] result = max(v) print(result)
min() :最小值
v = [1,2,311,21,3,] result = min(v) print(result)
sum() :求和
v = [1,2,311,21,3,] result = sum(v) print(result)
divmod() :兩數相除,得商和餘數
a,b = divmod(1001,5) print(a,b)
分頁功能
# 練習題 請經過分頁對數據進行展現 """ 要求: 每頁顯示10條數據 讓用戶輸入要查看的頁面:頁碼 """ lis = [] for i in range(1,845): info = {'name':'大慄%s'%i,'age':'1%s'%i} lis.append(info) per_page= 10 total_data = 845 page,other = divmod(total_data,per_page) if other != 0: page += 1 # 1 0-10 # 2 10-20 # 3 20-30 while True: message = input('請輸入頁數:') message = int(message) if message>845 or message<1: print('錯誤') else : start_position = (message-1)*per_page end_position = message*per_page data = lis[start_position:end_position] print(data) for item in data: print(item)
LIS = [] for i in range(1,934): info = {'name':'小豬%s'%i,'hobby':'睡覺%s'%i} LIS.append(info) how_many = 7 hole_length = len(LIS) print(hole_length) hole_length,rest = divmod(hole_length,how_many) if rest != 0: hole_length += 1 # 1 0,7 #2 7,14 #3 14,21 #4 21,28 while True: message = input("請輸入") message = int(message) if message>hole_length or message<1: print('輸入有誤,請在範圍內輸入;') else: start_location =(message-1)*how_many end_location = message*how_many total = LIS[start_location:end_location] for line in total: print(line) """
編碼相關
chr :將十進制轉化爲Unicode編碼中對應的字符串
v = chr(99) print(v)
ord :將Unicode編碼中對應的字符串找到並轉化爲其對應的十進制
num = ord('中')
# 應用 # 隨機驗證碼 import random def get_random_code(length = 6): LIS = [] for i in range(length): v = random.randint(65,90) LIS.append(chr(v)) var = "".join(LIS) return var v1 = get_random_code(7) print(v1)
import random # 導入一個模塊 v = random.randint(起始,終止) # 獲得一個隨機數
高級一點的內置函數
map:循環每一個元素(第二個參數),而後讓每一個元素執行函數(第一個參數),將每一個函數執行的結果保存到新的列表裏並返回。(有返回值)
v1 = [11,22,33,44] result = map(lambda x:x+100,v1) print(list(result)) # 特殊 # 每一個數乘以10 v1 = [12,34,45,23] var = map(lambda x:x*10,v1) print(list(var))
filter
v1 = [11,22,33,'asd',44,'xf'] def func(x): if type(x) == int: return True return False result = filter(func,v1) # [11,] print(list(result)) result = filter(lambda x: True if type(x) == int else False ,v1) print(list(result)) result = filter(lambda x: type(x) == int ,v1) print(list(result))
reduce
import functools v1 = ['wo','hao','e'] def func(x,y): return x+y result = functools.reduce(func,v1) print(result) result = functools.reduce(lambda x,y:x+y,v1) print(result)
面試題:
經常使用的內置函數有哪些?
filter/map/reduce是什麼意思?
什麼是匿名函數?
進制轉換相關
bin:將十進制轉換爲二進制
num = 13 v1 = bin(num) print(v1)
oct:將十進制轉換爲八進制
num = 13 v1 = oct(num) print(v1)
int:將十進制轉換爲十進制
num = 13 v1 = int(num) print(v1)
hex:將十進制轉換爲十六進制
num = 13 v1 = hex(num) print(v1)
二進制轉換爲十進制
v1 = "0b1101" result = int(v1,base = 2) print(result)
二進制轉換爲八進制
v1 = "0o1101" result = int(v1,base = 2) print(result)
二進制轉換爲十六進制
v1 = "0x1101" result = int(v1,base = 2) print(result)
ip地址轉換成二進制數(面試)
# 1字節等於8位 # IP: 192.168.12.79 -> 001010010 . 001010010 . 001010010 . 001010010 # 1. 請將 ip = "192.168.12.79" 中的每一個十進制數轉換成二進制並經過,鏈接起來生成一個新的字符串。 # 簡單版——假面試 lis = [] ip = "192.168.12.79" var = ip.split(".") for i in var: new_i = int(i) x = bin(new_i) lis.append(x) result = ",".join(lis) print(result) # 增強版——真面試 lis = [] ip = "192.168.12.79" a = ip.split(".") for i in a: new_i = int(i) var = bin(new_i) var = var[2:] if len(var) != 8: var = var.rjust(8,'0') lis.append(var) x = "".join(lis) print(int(x,base=2))
函數內部執行相互之間不會混亂,執行完畢+內部元素不被其餘人使用
函數能夠作返回值進行返回
def func(): print(123) def bar(): return func # bar函數加括號執行通過return返回給v,此時v爲func函數,可是並無執行 v = bar() # v加括號,執行func函數 v()
def bar(): def inner(): print(123) return inner # bar函數加括號執行,將inner函數加載到內存,可是沒有執行,返回inner函數 v = bar() # 此時的v爲inner函數,加括號執行 v()
函數的變量位置問題
# 此時全局變量name爲大慄 name = '大栗子' def bar(): name = '小栗子' def inner(): print(name) return inner # bar函數加括號執行時,將name=大栗子修改爲了name=小栗子,並保存到內存 v = bar() # 此時v爲inner函數,執行打印name爲小栗子 v()
# 再來看一個 name = '糖炒栗子' def bar(name): def inner(): print(name) return inner v1 = bar('大慄') # { name=alex, inner } # 閉包,爲函數建立一塊區域(內部變量供本身使用),爲他之後執行提供數據。 v2 = bar('小慄') # { name=eric, inner } v1() v2() # 打印的name分別爲大慄、小慄
帶閉包、傳參的面試題
# 簡單版面試題 info = [] def func(): print(item) # 此時的for循環已經結束,在內存地址中的item已經爲9 for item in range(10): info.append(func) info[0]() # 9 # 增強版 info = [] def func(i): def inner(): print(i) return inner # 循環的時候,把每一個item封裝到了內存地址,爲後面的使用進行保留(閉包) for item in range(10): info.append(func(item)) # 0 1 4 info[0]() info[1]() info[4]()
閉包:爲函數建立一塊區域(內部變量供本身使用),爲之後的執行提供數據
def func(name): def inner(): print(name) return inner v1 = func('alex') v1() v2 = func('eric') v2()
注:函數什麼時候被建立,進而判斷將變量保存到了內存地址
高階函數:把函數當作參數傳遞、把函數當作返回值
總結:函數執行的流程分析
今天主要分享了函數的一些簡單的應用、高級的應用、傳參、lambda函數的簡單使用,以及函數的相對高級的概念,什麼是閉包,這些都是咱們之後再敲代碼的時候須要緊緊掌握的。