python傳參的幾種方式


針對string類型的split()函數。它主要是切割字符串,結果返回由字符串元素組成的一個列表,所以在使用二次切割的時候一定要注意數據類型:

split()方法以及關於str.split()[0]等形式內容的詳細講解

str.split(str="", num=string.count(str)).

參數:

  • str – 分隔符,默認為所有的空字符,包括空格、換行(\n)、制表符(\t)等。
  • num – 分割次數。默認為 -1, 即分隔所有。

返回值:

Python split() 通過指定分隔符對字符串進行切片,如果參數 num 有指定值,則分隔 num+1 個子字符串

  • 返回分割后的字符串列表。

代碼示例:

  • 輸入
str = "Line1-abcdef \nLine2-abc \nLine4-abcd"; print str.split( ); # 以空格為分隔符,包含 \n print str.split(' ', 1 ); # 以空格為分隔符,分隔成兩個
  • 輸出
['Line1-abcdef', 'Line2-abc', 'Line4-abcd'] ['Line1-abcdef', '\nLine2-abc \nLine4-abcd']

關於str.split()[0]等形式內容的詳細講解

代碼示例:

  • 輸入與輸出
>>> str="hello boy<[www.doiido.com]>byebye" >>> str.split("[")[1].split("]")[0] 'www.doiido.com' >>> str.split("[")[1].split("]")[0].split(".") ['www', 'doiido', 'com']
  • 解析:

str.split("[")[1]. split("]")[0]輸出的是 [ 后的內容以及 ] 前的內容。
str.split("[")[1]. split("]")[0]. split(".") 是先輸出 [ 后的內容以及 ] 前的內容,然后通過 . 作為分隔符對字符串進行切片。

下面再對上面的例子進一步操作加深理解:

str="hello boy<[www.doiido.com]>byebye" str.split("o")[0]

得到:‘hell’

str="hello boy<[www.doiido.com]>byebye" str.split("o")[1]

得到:’ b’(這里b的前面有個空格!)

str="hello boy<[www.doiido.com]>byebye" str.split("o")[3]

得到:‘iid’(這里得到的iid是第3個o后和第4個o前之間的內容)

str="hello boy<[www.doiido.com]>byebye" str.split("[")[0] 
  • 得到:‘hello boy<’(這里得到的hello boy<是第一個[之前的內容)
  • 解析:
    str.split(“o”)[0]得到的是第一個o之前的內容
    str.split(“o”)[1]得到的是第一個o和第二個o之間的內容
    str.split(“o”)[3]得到的是第三個o后和第四個o前之間的內容
    str.split("[")[0]得到的是第一個 [ 之前的內容
    注意:[ ]內的數值必須小於等於split("")內分隔符的個數,否則會報錯,報錯內容如下:
str="hello boy<[www.doiido.com]>byebye" str.split("o")[6]
IndexError                                Traceback (most recent call last) <ipython-input-15-50d5956c7ce9> in <module>() 1 str="hello boy<[www.doiido.com]>byebye" ----> 2 str.split("o")[6] IndexError: list index out of range

如有錯誤內容請積極批評指正!感謝!
參考內容:
http://www.runoob.com/python/att-string-split.html
http://www.cnblogs.com/douzi2/p/5579651.html

 

 

 

如果在運行python腳本時需要傳入一些參數,例如gpusbatch_size,可以使用如下三種方式。

python script.py 0,1,2 10
python script.py -gpus=0,1,2 --batch-size=10
python script.py -gpus=0,1,2 --batch_size=10

這三種格式對應不同的參數解析方式,分別為sys.argvargparse、 tf.app.run, 前兩者是python自帶的功能,后者是tensorflow提供的便捷方式。

1.sys.argv

sys模塊是很常用的模塊, 它封裝了與python解釋器相關的數據,例如 sys.modules里面有已經加載了的所有模塊信息, sys.path里面是 PYTHONPATH的內容,而 sys.argv則封裝了傳入的參數數據。
使用 sys.argv接收上面第一個命令中包含的參數方式如下:
import sys
gpus = sys.argv[1]
#gpus = [int(gpus.split(','))]
batch_size = sys.argv[2]
print(gpus)
print(batch_size)

2.argparse

復制代碼
import argparse
parser = argparse.ArgumentParser(description='manual to this script')
parser.add_argument("--gpus", type=str, default="0")
parser.add_argument("--batch-size", type=int, default=32)
args = parser.parse_args()
print(args.gpus)
print(args.batch_size)
復制代碼
需要注意的是,腳本運行命令 python script.py -gpus=0,1,2 --batch-size=10中的 --batch-size會被自動解析成 batch_size.
parser.add_argument 方法的 type參數理論上可以是任何合法的類型, 但有些參數傳入格式比較麻煩,例如list,所以一般使用 boolintstrfloat這些基本類型就行了,更復雜的需求可以通過 str傳入,然后手動解析。 bool類型的解析比較特殊,傳入任何值都會被解析成 True,傳入空值時才為 False

3.tf.app.run

復制代碼
import tensorflow as tf
tf.app.flags.DEFINE_string('gpus', None, 'gpus to use')
tf.app.flags.DEFINE_integer('batch_size', 5, 'batch size')

FLAGS = tf.app.flags.FLAGS

def main(_):
    print(FLAGS.gpus)
    print(FLAGS.batch_size)

if __name__=="__main__":
    tf.app.run()
復制代碼

有幾點需要注意:

tensorflow只提供以下幾種方法:

tf.app.flags.DEFINE_string
tf.app.flags.DEFINE_integer,
tf.app.flags.DEFINE_boolean,
tf.app.flags.DEFINE_float 四種方法,分別對應strint,bool,float類型的參數。這里對bool的解析比較嚴格,傳入1會被解析成True,其余任何值都會被解析成False

腳本中需要定義一個接收一個參數的main方法:def main(_):,這個傳入的參數是腳本名,一般用不到, 所以用下划線接收。

batch_size參數為例,傳入這個參數時使用的名稱為--batch_size,也就是說,中划線不會像在argparse 中一樣被解析成下划線。

tf.app.run()會尋找並執行入口腳本的main方法。也只有在執行了tf.app.run()之后才能從FLAGS中取出參數。
從它的簽名來看,它也是可以自己指定需要執行的方法的,不一定非得叫main


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM