Python 函數(shù)定義以及參數(shù)傳遞
專(zhuān)業(yè)領(lǐng)域包括網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、商城網(wǎng)站制作、微信營(yíng)銷(xiāo)、系統(tǒng)平臺(tái)開(kāi)發(fā), 與其他網(wǎng)站設(shè)計(jì)及系統(tǒng)開(kāi)發(fā)公司不同,創(chuàng)新互聯(lián)的整合解決方案結(jié)合了幫做網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗(yàn)和互聯(lián)網(wǎng)整合營(yíng)銷(xiāo)的理念,并將策略和執(zhí)行緊密結(jié)合,為客戶提供全網(wǎng)互聯(lián)網(wǎng)整合方案。
1.函數(shù)定義
#形如def func(args...):
doSomething123
以關(guān)鍵字def 開(kāi)頭,后面是函數(shù)名和參數(shù)下面是函數(shù)處理過(guò)程。
舉例:
def add( a, b ):
return a+b12
參數(shù)可以設(shè)定默認(rèn)值,如:
def add( a, b=10 ): #注意:默認(rèn)值參數(shù)只會(huì)運(yùn)算一次
return a+b12
默認(rèn)值參數(shù)只會(huì)運(yùn)算一次是什么意思?
def func( a, b=[] ): #b的默認(rèn)值指向一個(gè)空的列表,每次不帶默認(rèn)值都會(huì)指向這塊內(nèi)存
b.append(a) return b
print(func(1))#向默認(rèn)的空列表里加入元素1 ,默認(rèn)列表里已經(jīng)是[1]print(func(2))#向默認(rèn)的列表里加入元素2,默認(rèn)列表里已經(jīng)是[1,2]print(func(3,[]))#向b指向的空列表里加入元素1 ,默認(rèn)列表里還是[1,2]print(func(4))#向默認(rèn)的列表里加入元素4,默認(rèn)列表里已經(jīng)是[1,2,4]'''
結(jié)果:
[1]
[1, 2]
[3]
[1, 2, 4]
'''12345678910111213141516
這下明白為什么默認(rèn)參數(shù)只計(jì)算一次了吧,函數(shù)參數(shù)不傳遞時(shí)默認(rèn)值總是指向固定的內(nèi)存空間,就是第一次計(jì)算的空間。
2.參數(shù)傳遞
def func(a, b):
print('a=%d, b=%d' % (a,b) )12
在使用函數(shù)時(shí)可以如下方式,結(jié)果都是相同的
func(10,20) #不使用參數(shù)名,需要按參數(shù)順序傳遞func(a=10,b=20) #使用參數(shù)名可以不按順序傳遞func(b=20,a=10)#結(jié)果:a=10, b=20a=10, b=20a=10, b=201234567
如果函數(shù)定義形式如下方式:
def func(*args): #這種定義會(huì)把傳遞的參數(shù)包成元組
print(args,type(args))
func(10,20)#結(jié)果:#(10, 20) class 'tuple'1234567
舉一個(gè)和上述過(guò)程相反的例子:
def func(a,b):
print('a=%d, b=%d' % (a,b) )
a = (10, 20)
func(*a) #在調(diào)用函數(shù)使用`*`則會(huì)把元組解包成單個(gè)變量按順序傳入函數(shù)#結(jié)果:a=10, b=20123456
總結(jié):*號(hào)在定義函數(shù)參數(shù)時(shí),傳入函數(shù)的參數(shù)會(huì)轉(zhuǎn)換成元組,如果 *號(hào)在調(diào)用時(shí)則會(huì)把元組解包成單個(gè)元素。
另一種定義:
def func(**kw):#使用**定義參數(shù)會(huì)把傳入?yún)?shù)包裝成字典dict
print(kw, type(kw) )
func(a=10,b=20)#這種函數(shù)在使用時(shí)必須指定參數(shù)值,使用key=value這種形式#結(jié)果:{'b': 20, 'a': 10} class 'dict'12345
相反的例子:
def func(a,b):
print('a=%d, b=%d' % (a,b) )
d = {'a':10, 'b':20 }
func(**d) #在調(diào)用時(shí)使用**會(huì)把字典解包成變量傳入函數(shù)。12345
def func(*args, **kw):#這種形式的定義代表可以接受任意類(lèi)型的參數(shù)
print(args,kw )12
總結(jié):**號(hào)在定義函數(shù)參數(shù)時(shí),傳入函數(shù)的參數(shù)會(huì)轉(zhuǎn)換成字典,如果 **號(hào)在調(diào)用時(shí)則會(huì)把字典解包成單個(gè)元素。
lambda表達(dá)式
lambda表達(dá)式就是一種簡(jiǎn)單的函數(shù)
形如 f = lambda 參數(shù)1,參數(shù)2: 返回的計(jì)算值
例如:
add = lambda x,y: x+y
print(add(1,2))'''
結(jié)果:3
'''12345
16年年會(huì)抽獎(jiǎng)網(wǎng)上有人對(duì)公司的抽獎(jiǎng)結(jié)果又偏見(jiàn),于是全員進(jìn)行了抽獎(jiǎng)代碼的review,好像是愛(ài)奇藝公司的,下面用python來(lái)實(shí)現(xiàn)一個(gè)抽獎(jiǎng)程序。
主要功能有
1.從一個(gè)csv文件中讀入所有員工工號(hào)
2.將這些工號(hào)初始到一個(gè)列表中
3.用random模塊下的choice函數(shù)來(lái)隨機(jī)選擇列表中的一個(gè)工號(hào)
4.抽到的獎(jiǎng)項(xiàng)的工號(hào)要從列表中進(jìn)行刪除,以免再次抽到
初級(jí)版
這個(gè)比較簡(jiǎn)單,缺少定制性,如沒(méi)法設(shè)置一等獎(jiǎng)有幾名,二等獎(jiǎng)有幾名
import csv#創(chuàng)建一個(gè)員工列表emplist = []#用with自動(dòng)關(guān)閉文件with open('c://emps.csv') as f:
empf = csv.reader(f) for emp in empf:
emplist.append(emp)
print("進(jìn)行一等獎(jiǎng)抽獎(jiǎng),共有一名")import random#利用random模塊的chice函數(shù)來(lái)從列表中隨機(jī)選取一個(gè)元素e1 = random.choice(emplist)#將中獎(jiǎng)的員工從列表中剔除emplist.remove(e1)
print('一等獎(jiǎng)得主的號(hào)碼是 %s' % e1)
print('進(jìn)行三個(gè)二等獎(jiǎng)的號(hào)碼抽獎(jiǎng)')
e2_1 = random.choice(emplist)
emplist.remove(e2_1)
e2_2 = random.choice(emplist)
emplist.remove(e2_2)
e2_3 = random.choice(emplist)
emplist.remove(e2_3)
print('獲得3個(gè)二等獎(jiǎng)是 %s %s %s',(e2_1,e2_2,e2_3))#下面依次類(lèi)推可以設(shè)置三等獎(jiǎng)的抽獎(jiǎng)123456789101112131415161718192021222324
改進(jìn)版
上面的那個(gè)初級(jí)版,假如要設(shè)置個(gè)三等獎(jiǎng)一百名那么將要重新維護(hù)幾百行代碼,下面用比較高級(jí)點(diǎn)的辦法實(shí)現(xiàn).
我們考慮用面向?qū)ο髞?lái)實(shí)現(xiàn),設(shè)計(jì)一個(gè)抽獎(jiǎng)?lì)悾?lèi)中包含一個(gè)屬性(號(hào)碼來(lái)源),一個(gè)方法:產(chǎn)生所有抽獎(jiǎng)層次指定個(gè)數(shù)的抽獎(jiǎng)號(hào)碼。
用到如下知識(shí)點(diǎn):
1. csv模塊部分函數(shù)用法
2. sys模塊讀取輸入
3. random模塊函數(shù)choice函數(shù)用法
4. 列表和字典元素的添加、刪除
6. for循環(huán)中range用法
7. 類(lèi)和面向?qū)ο?/p>
8. 字符打印,print中的計(jì)算
9.open中with
#!/usr/bin/python#coding=utf-8import csvimport sysimport random
reload(sys)
sys.setdefaultencoding('utf8')#coding=utf-8print("開(kāi)始進(jìn)行抽獎(jiǎng)")#定義個(gè)抽獎(jiǎng)?lì)?,功能有輸入抽?jiǎng)級(jí)別和個(gè)數(shù),打印出每個(gè)級(jí)別的抽獎(jiǎng)員工號(hào)碼class Choujiang:
#定義scv文件路徑
def __init__(self,filepath):
self.empfile = filepath def creat_num(self):
emplist = [] with open(self.empfile) as f:
empf = csv.reader(f) for emp in empf:
emplist.append(emp)
print('共有%s 人參與抽獎(jiǎng)' % len(emplist))
levels = int(input('抽獎(jiǎng)分幾個(gè)層次,請(qǐng)輸入:')) #定義一個(gè)字典
level_dict = {} for i in range(0,levels):
print('請(qǐng)輸入當(dāng)前獲獎(jiǎng)層次 %s 對(duì)應(yīng)的獎(jiǎng)品個(gè)數(shù)' % ( i + 1))
str_level_dict_key = sys.stdin.readline()
int_level_dict_key = int(str_level_dict_key)
level_dict[i] = int_level_dict_key #循環(huán)完成后抽獎(jiǎng)層次字典構(gòu)造完畢
#進(jìn)行抽獎(jiǎng)開(kāi)始
print('抽獎(jiǎng)字典設(shè)置為: %s' % level_dict) for i in range(0,len(level_dict)):
winers = [] #產(chǎn)生當(dāng)前抽獎(jiǎng)層次i對(duì)應(yīng)的抽獎(jiǎng)個(gè)數(shù)
for j in range(0,int(level_dict[i])): #利用random模塊中的choice函數(shù)從列表中隨機(jī)產(chǎn)生一個(gè)
winer = random.choice(emplist)
winers.append(winer)
emplist.remove(winer)
print('抽獎(jiǎng)層次 %s 下產(chǎn)出的獲獎(jiǎng)人員有:' % (i + 1 ))
print(winers)#類(lèi)功能定義完畢,開(kāi)始初始化并使用if __name__ == '__main__':
peoples = Choujiang('c://emps.csv')
peoples.creat_num()1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
該段程序在python 2.6 以上及 3中均可以運(yùn)行,運(yùn)行結(jié)果如下圖:
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information. ================================ RESTART ================================ 開(kāi)始進(jìn)行抽獎(jiǎng)
共有24790 人參與抽獎(jiǎng)
抽獎(jiǎng)分幾個(gè)層次,請(qǐng)輸入:2請(qǐng)輸入當(dāng)前獲獎(jiǎng)層次 1 對(duì)應(yīng)的獎(jiǎng)品個(gè)數(shù)1請(qǐng)輸入當(dāng)前獲獎(jiǎng)層次 2 對(duì)應(yīng)的獎(jiǎng)品個(gè)數(shù)3抽獎(jiǎng)字典設(shè)置為: {0: 1, 1: 3}
抽獎(jiǎng)層次 1 下產(chǎn)出的獲獎(jiǎng)人員有:
[['張三19826']]
抽獎(jiǎng)層次 2 下產(chǎn)出的獲獎(jiǎng)人員有:
[['張三18670'], ['張三23235'], ['張三15705']] 1234567891011121314151617
#data和name_data數(shù)據(jù)自己添加
import random
# 所有員工數(shù)據(jù),字典的key是一個(gè)set類(lèi)型,value是list類(lèi)型
data = {
('能永年', '甲隊(duì)'): ['項(xiàng)目隊(duì)長(zhǎng)', '曾經(jīng)外派抵達(dá)x地做出了某事', '曾經(jīng)外派抵達(dá)子公司做出了ss項(xiàng)目'],
('巴偉毅', '乙隊(duì)'): ['HR'],
('紀(jì)文博', '丙隊(duì)'): ['項(xiàng)目成員', '為xx事做出了重大貢獻(xiàn)', '曾經(jīng)做過(guò)AA項(xiàng)目'],
('吉信鴻', '丙隊(duì)'): ['HR', '為公司面試了XX人次', ],
('沙雅旭', '丙隊(duì)'): ['財(cái)務(wù)管理', '針對(duì)財(cái)務(wù)的做出了重要指導(dǎo)'],
}
name_data = ['能永年', '巴偉毅', '紀(jì)文博', '吉信鴻', '沙雅旭'] ?# 參見(jiàn)抽獎(jiǎng)人的姓名
random_name = random.choice(name_data) ?# 隨機(jī)一個(gè)中獎(jiǎng)的人
for key, value in data.items():
# print(key,value)
if random_name == key[0]: ?# 在字典key中找到這人
print('{}:{}'.format(key[0], key[1]))
for item in value: ?# 遍歷他的信息
print('\t\t' + item.ljust(20))
**2. **創(chuàng)建Die類(lèi)****
5.匯總
這個(gè)可以創(chuàng)建多種玩法,隨機(jī)搖骰子只是其中的一種,還可以先讓一個(gè)人輸入一個(gè)幸運(yùn)數(shù)字并儲(chǔ)存起來(lái),然后再執(zhí)行程序,如果數(shù)字不等于幸運(yùn)數(shù)字就不是幸運(yùn)星,當(dāng)數(shù)字等于時(shí)就是幸運(yùn)星并結(jié)束程序——類(lèi)似抽獎(jiǎng)。。。。
總之玩法很多,看你怎么寫(xiě),用最基礎(chǔ)的知識(shí)來(lái)實(shí)現(xiàn)!