有些時(shí)候我們需要通過(guò)命令行將參數(shù)傳遞給腳本,C語(yǔ)言中有個(gè)getopt()方法,python中也有個(gè)類似的命令行參數(shù)解析方法getopt()。python也提供了比getopt()更簡(jiǎn)潔的argparse方法。另外,sys模塊也可以實(shí)現(xiàn)簡(jiǎn)單的參數(shù)解析,本文將對(duì)這3種命令行參數(shù)解析方法簡(jiǎn)要介紹。
創(chuàng)新互聯(lián)2013年開(kāi)創(chuàng)至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元余慶做網(wǎng)站,已為上家服務(wù),為余慶各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792
sys.argv是傳入的參數(shù)列表,sys.argv[0]是當(dāng)前python腳本的名稱,sys.argv[1]表示第一個(gè)參數(shù),以此類推。
命令行運(yùn)行:
可以看到傳入的參數(shù)通過(guò)sys.argv來(lái)獲取,它就是一個(gè)參數(shù)列表。
python的getopt與C語(yǔ)言的的getopt()函數(shù)類似。相比于sys模塊,支持長(zhǎng)參數(shù)和短參數(shù),并對(duì)參數(shù)解析賦值。但它需要結(jié)合sys模塊進(jìn)行參數(shù)解析,語(yǔ)法格式如下:
短參數(shù)為單個(gè)英文字母,如果必須賦值需要在后面加英文冒號(hào)( : ),長(zhǎng)參數(shù)一般為字符串(相比短參數(shù),更能說(shuō)明參數(shù)含義),如果必須賦值需要在后面加等號(hào)( = )。
命令行運(yùn)行:
注意:短參數(shù)(options)和長(zhǎng)參數(shù)(long_options)不需要一一對(duì)應(yīng),可以任意順序,也可以只有短參數(shù)或者只有長(zhǎng)參數(shù)。
argparse模塊提供了很多可以設(shè)置的參數(shù),例如參數(shù)的默認(rèn)值,幫助消息,參數(shù)的數(shù)據(jù)類型等。argparse類主要包括ArgumentParser、add_argument和parse_args三個(gè)方法。
下面介紹這三個(gè)函數(shù)的使用方法。
argparse默認(rèn)提供了 -h | --help 參數(shù):
命令行運(yùn)行:
下面列出部分參數(shù):
下面來(lái)添加參數(shù):
命令行運(yùn)行:
parse_args() 方法用于解析參數(shù),在前面的示例代碼中使用parse_args方法來(lái)提取參數(shù)值,對(duì)于無(wú)效或者錯(cuò)誤的參數(shù)會(huì)打印錯(cuò)誤信息和幫助信息:
命令行運(yùn)行:
本文介紹了Python的三種命令行參數(shù)解析方法sys.argv、getopt和argparse,可以根據(jù)自己的需要進(jìn)行選擇,getopt和argparse兩種方法相比來(lái)說(shuō),建議選擇argparse,代碼量更少更簡(jiǎn)潔。更詳細(xì)的使用方法參考官方文檔:
--THE END--
參數(shù)可以是任意類型。
比如可以是列表。
-------------------------------
library=['python精通','MySQL','數(shù)據(jù)分析','人工智能']
#形參
def add_book(bookname):
library.append(bookname)
print('圖書(shū)添加成功!')
pass
def show_book(books):
for book in books:
print(book)
pass
pass
#調(diào)用函數(shù)
add_book('新概念英語(yǔ)')
show_book(library)
------------------------------
#輸出列表中所有大于50的數(shù)
list1=[23,45,77,88,58,10]
def get_list(list_1):
new_list=[ ]
for e in list_1:
if e=50:
new_list.append(e)
pass
pass
print(new_list)
pass
#調(diào)用函數(shù)
get_list(list1) #[77,88,58]
------------------------------
#刪除列表中小于50的數(shù)
def remove_from_list(list_1):
n=0
while nlen(list_1): p="" /len(list_1):
if list_1[n]50:
list_1.remove(list_1[n])
pass
else:
n+=1
pass
pass
print(list_1)
pass
#調(diào)用函數(shù)
remove_from_list(list1) #[77,88,58]
1、torch.cat(inputs, dim=0) - Tensor?
參考鏈接:
[Pytorch] 詳解 torch.cat()
Pytorch學(xué)習(xí)筆記(一):torch.cat()模塊的詳解
函數(shù)作用:cat 是 concatnate 的意思:拼接,聯(lián)系在一起。在給定維度上對(duì)輸入的 Tensor 序列進(jìn)行拼接操作。torch.cat 可以看作是 torch.split 和 torch.chunk 的反操作
參數(shù):
inputs(sequence of Tensors):可以是任意相同類型的 Tensor 的 python 序列
dim(int, optional):defaults=0
dim=0: 按列進(jìn)行拼接?
dim=1: 按行進(jìn)行拼接
dim=-1: 如果行和列數(shù)都相同則按行進(jìn)行拼接,否則按照行數(shù)或列數(shù)相等的維度進(jìn)行拼接
假設(shè) a 和 b 都是 Tensor,且 a 的維度為 [2, 3],b 的維度為 [2, 4],則
torch.cat((a, b), dim=1) 的維度為 [2, 7]
2、torch.nn.CrossEntropyLoss()
函數(shù)作用:CrossEntropy 是交叉熵的意思,故而 CrossEntropyLoss 的作用是計(jì)算交叉熵。CrossEntropyLoss 函數(shù)是將 torch.nn.Softmax 和 torch.nn.NLLLoss 兩個(gè)函數(shù)組合在一起使用,故而傳入的預(yù)測(cè)值不需要先進(jìn)行 torch.nnSoftmax 操作。
參數(shù):
input(N, C):N 是 batch_size,C 則是類別數(shù),即在定義模型輸出時(shí),輸出節(jié)點(diǎn)個(gè)數(shù)要定義為 [N, C]。其中特別注意的是 target 的數(shù)據(jù)類型需要是浮點(diǎn)數(shù),即 float32
target(N):N 是 batch_size,故 target 需要是 1D 張量。其中特別注意的是 target 的數(shù)據(jù)類型需要是 long,即 int64
例子:
loss = nn.CrossEntropyLoss()
input = torch.randn(3, 5, requires_grad=True, dtype=torch.float32)
target = torch.empty(3, dtype=torch.long).random_(5)
output = loss(input, target)
output
輸出為:
tensor(1.6916, grad_fn=NllLossBackward)
Python函數(shù)的參數(shù)類型主要包括必選參數(shù)、可選參數(shù)、可變參數(shù)、位置參數(shù)和關(guān)鍵字參數(shù),本文介紹一下他們的定義以及可變數(shù)據(jù)類型參數(shù)傳遞需要注意的地方。
必選參數(shù)(Required arguments)是必須輸入的參數(shù),比如下面的代碼,必須輸入2個(gè)參數(shù),否則就會(huì)報(bào)錯(cuò):
其實(shí)上面例子中的參數(shù) num1和num2也屬于關(guān)鍵字參數(shù),比如可以通過(guò)如下方式調(diào)用:
執(zhí)行結(jié)果:
可選參數(shù)(Optional arguments)可以不用傳入函數(shù),有一個(gè)默認(rèn)值,如果沒(méi)有傳入會(huì)使用默認(rèn)值,不會(huì)報(bào)錯(cuò)。
位置參數(shù)(positional arguments)根據(jù)其在函數(shù)定義中的位置調(diào)用,下面是pow()函數(shù)的幫助信息:
x,y,z三個(gè)參數(shù)的的順序是固定的,并且不能使用關(guān)鍵字:
輸出:
在上面的pow()函數(shù)幫助信息中可以看到位置參數(shù)后面加了一個(gè)反斜杠 / ,這是python內(nèi)置函數(shù)的語(yǔ)法定義,Python開(kāi)發(fā)人員不能在python3.8版本之前的代碼中使用此語(yǔ)法。但python3.0到3.7版本可以使用如下方式定義位置參數(shù):
星號(hào)前面的參數(shù)為位置參數(shù)或者關(guān)鍵字參數(shù),星號(hào)后面是強(qiáng)制關(guān)鍵字參數(shù),具體介紹見(jiàn)強(qiáng)制關(guān)鍵字參數(shù)。
python3.8版本引入了強(qiáng)制位置參數(shù)(Positional-Only Parameters),也就是我們可以使用反斜杠 / 語(yǔ)法來(lái)定義位置參數(shù)了,可以寫(xiě)成如下形式:
來(lái)看下面的例子:
python3.8運(yùn)行:
不能使用關(guān)鍵字參數(shù)形式賦值了。
可變參數(shù) (varargs argument) 就是傳入的參數(shù)個(gè)數(shù)是可變的,可以是0-n個(gè),使用星號(hào)( * )將輸入?yún)?shù)自動(dòng)組裝為一個(gè)元組(tuple):
執(zhí)行結(jié)果:
關(guān)鍵字參數(shù)(keyword argument)允許將任意個(gè)含參數(shù)名的參數(shù)導(dǎo)入到python函數(shù)中,使用雙星號(hào)( ** ),在函數(shù)內(nèi)部自動(dòng)組裝為一個(gè)字典。
執(zhí)行結(jié)果:
上面介紹的參數(shù)可以混合使用:
結(jié)果:
注意:由于傳入的參數(shù)個(gè)數(shù)不定,所以當(dāng)與普通參數(shù)一同使用時(shí),必須把帶星號(hào)的參數(shù)放在最后。
強(qiáng)制關(guān)鍵字參數(shù)(Keyword-Only Arguments)是python3引入的特性,可參考:。 使用一個(gè)星號(hào)隔開(kāi):
在位置參數(shù)一節(jié)介紹過(guò)星號(hào)前面的參數(shù)可以是位置參數(shù)和關(guān)鍵字參數(shù)。星號(hào)后面的參數(shù)都是強(qiáng)制關(guān)鍵字參數(shù),必須以指定參數(shù)名的方式傳參,如果強(qiáng)制關(guān)鍵字參數(shù)沒(méi)有設(shè)置默認(rèn)參數(shù),調(diào)用函數(shù)時(shí)必須傳參。
執(zhí)行結(jié)果:
也可以在可變參數(shù)后面命名關(guān)鍵字參數(shù),這樣就不需要星號(hào)分隔符了:
執(zhí)行結(jié)果:
在Python對(duì)象及內(nèi)存管理機(jī)制中介紹了python中的參數(shù)傳遞屬于對(duì)象的 引用傳遞 (pass by object reference),在編寫(xiě)函數(shù)的時(shí)候需要特別注意。
先來(lái)看個(gè)例子:
執(zhí)行結(jié)果:
l1 和 l2指向相同的地址,由于列表可變,l1改變時(shí),l2也跟著變了。
接著看下面的例子:
結(jié)果:
l1沒(méi)有變化!為什么不是[1, 2, 3, 4]呢?
l = l + [4]表示創(chuàng)建一個(gè)“末尾加入元素 4“的新列表,并讓 l 指向這個(gè)新的對(duì)象,l1沒(méi)有進(jìn)行任何操作,因此 l1 的值不變。如果要改變l1的值,需要加一個(gè)返回值:
結(jié)果:
下面的代碼執(zhí)行結(jié)果又是什么呢?
執(zhí)行結(jié)果:
和第一個(gè)例子一樣,l1 和 l2指向相同的地址,所以會(huì)一起改變。這個(gè)問(wèn)題怎么解決呢?
可以使用下面的方式:
也可以使用淺拷貝或者深度拷貝,具體使用方法可參考Python對(duì)象及內(nèi)存管理機(jī)制。這個(gè)問(wèn)題在Python編程時(shí)需要特別注意。
本文主要介紹了python函數(shù)的幾種參數(shù)類型:必選參數(shù)、可選參數(shù)、可變參數(shù)、位置參數(shù)、強(qiáng)制位置參數(shù)、關(guān)鍵字參數(shù)、強(qiáng)制關(guān)鍵字參數(shù),注意他們不是完全獨(dú)立的,比如必選參數(shù)、可選參數(shù)也可以是關(guān)鍵字參數(shù),位置參數(shù)可以是必選參數(shù)或者可選參數(shù)。
另外,python中的參數(shù)傳遞屬于對(duì)象的 引用傳遞 ,在對(duì)可變數(shù)據(jù)類型進(jìn)行參數(shù)傳遞時(shí)需要特別注意,如有必要,使用python的拷貝方法。
參考文檔:
--THE END--
所謂缺省參數(shù),在定義函數(shù)時(shí),可以給某個(gè)參數(shù)指定一個(gè)默認(rèn)值,具有默認(rèn)值的參數(shù)就叫做缺省參數(shù)。調(diào)用函數(shù)時(shí),如果沒(méi)有傳入缺省參數(shù)的值,則在函數(shù)內(nèi)部使用定義函數(shù)時(shí)指定的參數(shù)默認(rèn)值。
缺省參數(shù)的作用:
函數(shù)的缺省參數(shù),將常見(jiàn)的值設(shè)置為參數(shù)的缺省值,從而簡(jiǎn)化函數(shù)的調(diào)用。
例如:對(duì)列表排序的方法
執(zhí)行結(jié)果:
在參數(shù)后使用賦值語(yǔ)句,可以指定參數(shù)的缺省值。
不設(shè)置缺省參數(shù):
執(zhí)行結(jié)果:張三 是 男生
# 假設(shè)班上的男生比女生多,我們不傳遞True這個(gè)參數(shù),讓性別默認(rèn)是男生
設(shè)置缺省參數(shù):
執(zhí)行結(jié)果:
提示:
1. 缺省參數(shù),需要使用最常見(jiàn)的值作為默認(rèn)值。
2. 如果一個(gè)參數(shù)的值不能確定,則不應(yīng)該設(shè)置默認(rèn)值,具體的數(shù)值在調(diào)用函數(shù)時(shí),由外界傳遞。
一句話講在定義函數(shù)時(shí)怎樣指定函數(shù)的缺省參數(shù)的默認(rèn)值,在形參后面跟上一個(gè)等號(hào),等號(hào)后面跟上參數(shù)的默認(rèn)值就可以了??梢钥匆陨习咐?。
必須保證帶有默認(rèn)值的缺省參數(shù)在參數(shù)列表末尾。
所以,以下定義是錯(cuò)的:
PyCharm在錯(cuò)誤的參數(shù)下面會(huì)有一個(gè)波浪線提示,告訴你要么給它挪到缺省參數(shù)前面,要么它也變成帶有默認(rèn)值的缺省參數(shù)。
在調(diào)用函數(shù)時(shí),如果有多個(gè)缺省參數(shù),需要指定參數(shù)名,這樣解釋器才能能夠知道參數(shù)的對(duì)應(yīng)關(guān)系。
執(zhí)行結(jié)果:
python中的函數(shù),大多需要配置參數(shù),以下是幾種函數(shù)的參數(shù)類型:
1.必備參數(shù):以正確的順序、個(gè)數(shù)傳入函數(shù)。調(diào)用時(shí)的參數(shù)情況要和聲明時(shí)一樣。最常用的情況。
def tplink(a,b):
c=a+b+b
return c?
tplink(4,2)
2.關(guān)鍵字參數(shù):使用關(guān)鍵字參數(shù)允許函數(shù)調(diào)用時(shí)參數(shù)的順序和聲明時(shí)不一致,因?yàn)閜ython解析器會(huì)在調(diào)用函數(shù)時(shí),用參數(shù)名匹配參數(shù)值。
def tplink(age1,age2):
ageall=age1+age2+age2
return ageall
tplink(age2=4,age1=2)
3.默認(rèn)參數(shù):默認(rèn)某個(gè)參數(shù)的取值
def tplink(age1,age2=5):
ageall=age1+age2+age2
return ageall
tplink(age1=4)
4.不定長(zhǎng)參數(shù):在聲明時(shí)并不確定 調(diào)用時(shí)的參數(shù)數(shù)量。這種情況,可以用不定長(zhǎng)參數(shù)進(jìn)行解決,具體操作是在參數(shù)名前用*。
但不能和 關(guān)鍵字參數(shù)并用。一般在正常參數(shù)arg之后。
*args、**kwargs的定義:
這兩個(gè)都是python中的不定長(zhǎng)參數(shù),又稱為可變參數(shù)。
*args 表示任何多個(gè)無(wú)名參數(shù),它是一個(gè) tuple ;
**kwargs 表示關(guān)鍵字參數(shù),它是一個(gè)dict。
同時(shí)使用 * args和 ** kwargs 時(shí),必須 * args參數(shù)列要在 ** kwargs前。且都在arg之后。
函數(shù)在調(diào)用時(shí),會(huì)根據(jù)順序,看是否放進(jìn) *args 或者 **kwargs中。
具體可根據(jù)實(shí)際情況使用,可以 更方便靈活的接收信息。