- 函數(shù)代碼塊以def關鍵字開頭搁胆,后接函數(shù)標識符名稱和圓括號()
- 所有傳入的參數(shù)和自變量都必須放在圓括號內(nèi),可以在圓括號中定義參數(shù)隘击。
- 函數(shù)的第一行語句可以選擇性使用文檔字符串脊串,用于存放函數(shù)說明。
- 函數(shù)內(nèi)容以冒號:開始躏尉,并且要縮進蚯根。
- return [表達式]結(jié)束函數(shù),選擇性返回一個值給調(diào)用方胀糜。不帶表達式的return相當于返回None颅拦。
- return有兩個作用:
用來返回函數(shù)的運行結(jié)果,或者調(diào)用另外一個函數(shù)教藻。
函數(shù)結(jié)束的標志距帅。只要運行了return,就強制結(jié)束了函數(shù)括堤。return后面的程序都不會被執(zhí)行碌秸。其實,函數(shù)不一定有返回值悄窃。什么都不返回的函數(shù)不包含return語句讥电,或者包含return語句,但沒有在return后面指定值广匙。
if __name____=='___main____' 具體介紹:案例說明
1-先創(chuàng)建一個file.py的文件
pi=3.1415926
def file():
print('圓周率是: %s' %(pi)) #格式化輸出
file()
#輸出為:圓周率是:3.1415926
2-在創(chuàng)建另外一個file2.py的文件 允趟,調(diào)用file的pi的值恼策,
兩個文件在一個路徑下:
from file import pi
def calc_round(rad): #定義圓形面積求解函數(shù)
return pi * (rad ** 2)
def run():
print ("圓形面積為:",cale_round(5)) #調(diào)用函數(shù)
run()
#輸出為: 圓周率是:3.1415926
#圓形面積為:78.539815
可以看出來把“ 圓周率是:3.1415926” 這個也輸出來了鸦致。
因為第一個程序里面沒有加入if __name__ == '__main__',
3-增加第一個file.py的函數(shù)的主函數(shù)判斷:
pi=3.1415926
def file():
print('圓周率是: %s' %(pi)) #格式化輸出
if __name__ == '__main__':
file()
4-在運行file2.py 可以看出只有 “圓形面積為:78.539815”這一條輸出了涣楷。
1.直接運行:就是直接運行.py文件分唾,name也就是main.程序運行。
2.模塊導入:就是被當成模塊導入到其他python文件中使用狮斗,name為模塊的名字绽乔。
所以,if ___name____ == '____main____' 我們簡單的理解就是: 如果模塊是被直接運行的碳褒,則代碼塊被運行折砸,如果模塊是被導入的,則代碼塊不被運行.
基礎傳參
定義傳參:
def get_info(name,age):
print('%s is %s years old' %(name,age)) #格式化輸出
if __name__=='__main__:'
get_info('bob',25)
get_info(name='bob',age=25) #這種方法也可以
#輸出為:bob is 25 years old
非定義傳參沙峻,多個傳參睦授,需要通過*元組或者**字典來定義:
def fun1(*args): #args 是元組
print(args)
def fun2(**kwargs): #kwargs是表示字典
print(kwargs)
def fun3(*args,**kwargs):
print(args,kwargs)
if __name__=='__main__':
fun1()
fun1('hao')
fun1('hao',123)
fun1('hao',123,'hello')
fun2(name='wang',age=27)
fun3('hao',name='wang',age=27)
#輸出為:age(‘hao’)
#('hao',123,'hello')
#('name':'wang','age':27)
#(‘hao’,){name='wang',age=27}
列表字典傳參
def add(x,y):
print(x+y)
def get_info(name,age):
print('%s is %s years old ' % (name,age))
if __name__=='___main__':
nums =[10,5]
add(nums[0],nums[1]) #第一種方法傳遞
add(*num) #第二種方法將列表插開依次傳參
get_info(age=27,name='wang')
user = {'name':'wang','age':27}
get_info(**user) #將字典插開,拆成key=value的形式進行傳參
#輸出為:15
#wangh is 27 years old
舉例說明摔寨,在python核心編程第二版有個這個樣的例子:
from random import randint去枷,choice
from operator import add,sub
def add(x,y):
return x + y
def sub(x,y):
return x - y
def exam():
cmds={'+':add,'-':sub}
#cmds = {'+':lambda x,y:x + y,'-':lambda x,y : x - y} #通過把匿名函數(shù)放到里面
nums = [randint(1,100) for i in range(2)] #從1到100,隨機出來2個
nums.sort(reverse=True) #默認是False ,實現(xiàn)降序的排列
op = choice('+-')
result = cmds[op](*nums)
prompt = '%d %s %d =' %(nums[0],op,nums[1])
counter = 0
while counter < 3:
try: #不顯示錯誤類型,錯誤類型是空白删顶,如果不是數(shù)字的話竖螃,則繼續(xù)
answer = int(input(prompt))
except:
continue
if answer == result:
print("very good")
break
else:
print('wrong answer')
counter +=1
else:
print("the answer:")
print('%s %s' % (prompt,result))
if __name__ =='__main__':
while True:
exam()
try:
#去除兩邊的空白,然后在取出第一個字符
yn = input('continue(y/n)?').strip()[0].lower() #把字母變成小寫
except IndexError: #按回車是indexError,默認是y
continue
except (KeyboardInterrupt, EOFError): #按ctrl +c 或者 ctrl + d 的錯誤類型
yn = 'n' #默認為n
if yn in 'nN':
print('\nBye-bye')
break
高階傳參
通過函數(shù) filter() 函數(shù)來調(diào)用函數(shù)逗余,參數(shù)也是函數(shù)
通過函數(shù) map() 函數(shù)來調(diào)用函數(shù)特咆。
from random import randint
def func1(x):
return x % 2 #求偶數(shù)
def func2(x):
return x * 2 +1
if __name__ == '__main__':
nums=[randint(1,100) for i in range(10)] #隨機在1-100中選擇10個數(shù)字
print(nums)
print(list(filter(fun1,nums)))
#filter()要求第一個是函數(shù),第二個充當x傳遞函數(shù)录粱,返回True保留坚弱,返回False過濾掉
print(list(filter(lambda x : x % 2,nums))) #通過匿名函數(shù)來定義輸出
print(list(map(func2,nums)))
print(list(map(lambda x:x * 2 +1,nums))) #通過匿名函數(shù)來定義
#輸出結(jié)果為:
[8,44关摇,21荒叶,23,44输虱,55些楣,67,33宪睹,2愁茁,1]
[35,51亭病,7鹅很,69]
[35,51罪帖,7促煮,69]
[39,65整袁,33菠齿,11,33坐昙,57绳匀,13,79炸客,91疾棵,43]
文件傳參
通過運行一個file.py文件,來修改里面的內(nèi)容
python file.py file.txt True False
將file.txt里面的內(nèi)容的 True 更改為 False
file.txt 為file1
True 為file2
False 為file3
from os import remove,rename
from shutil import copy,copy2
from time import strftime,localtime
from sys import argv
localtime = strftime("%Y%m%d", localtime())
def word(file1,file2,file3):
file2 = file1 + '.bak' + localtime
tmp_file = file1 + '.temp'
copy2(file1, file2) #拷貝一個源文件
with open(file1, mode='r') as fr, open(tmp_file, mode='w') as fw:
for line in fr:
if file2 in line:
fw.write(line.replace(file2, file3))
else:
fw.write(line)
print("已將%s替換為%s"%(file2,file3))
remove(file1)
rename(tmp_file, file1)
return
if __name__ == "__main__":
try:
if len(sys.argv) == 4:
file1, file2, file3 = sys.argv[1:] #從左到右進行切片痹仙,分別給三個賦值
word(file1, file2, file3)
else:
print("傳參失敗是尔,請確定參數(shù)是否正確")
except (KeyboardInterrupt,EOFError,ValueError):
print("請輸入正確參數(shù)")
#python 中也可以使用 sys 的 sys.argv 來獲取命令行參數(shù):
#sys.argv 是命令行參數(shù)列表。
#len(sys.argv) 是命令行參數(shù)個數(shù)蝶溶。
#sys.argv[0] 表示腳本名