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