0-19は、接続文字列を作成します。
1 2 3 4 5 6 7 8
|
= [] NUMS 範囲(20)におけるnの: nums.append(STR(n))を プリント"" .join(NUMS)
#ベター書き込ま NUMSは= [STR(N-)N-における範囲(20)] プリント"" .join(NUMS)
|
文字列をステッチより
1 2 3 4 5 6 7
|
fooが= 'foo'で バー= 'bar'に
foobarに= FOO +バー#良い練習
FOO + = 'oooの' #悪い習慣、実行する必要があります。 fooは= '' .join([FOO 'OOO'])
|
1 2 3 4 5 6
|
fooが= 'foo'で バー= 'bar'に
foobarに= '%S%S' %(FOO、バー)# 生存 foobarに= '{0} {1 }。フォーマット(FOO、バー)# 良好 foobarに= '{FOO} {バー }'形式(FOO = FOO、バー=バー)#最高
|
名前の再使用しないでください
1 2 3
|
項目=「ABCD」#最初の文字列に... 項目items.split =(「」)#...上場となり 、その後のアイテム=セット(アイテム)#...とコレクションに
|
再利用のために命名され、効率が改善されなかった。どのような場合に割り当てが新しいオブジェクトを作成します。ただし、代入文の複雑さの増大と、それがより困難に指定された変数のタイプを識別すること、「場合」分岐およびループを含む他のコードから分離されます。実際にはいくつかのコードは、関数型プログラミングと、同じ変数名の割り当てを二度と繰り返さないことをお勧めします。実装は、「最後の」キーワードでJavaを使用することです。Pythonは「final」はキーワードではありません、これはその理念に反しています。それにもかかわらず、同じ変数名の割り当ての繰り返しを避けるためにはまだ良い習慣で、変数と不変タイプの概念を把握するのに役立ちます。
これは(*引数)でのパラメータの任意のリストを検討してはなりません
関数は、同じ特性を有するパラメータのリストを受け入れる場合、それは一般リストであるか、または任意の他の配列が明確にされるパラメータとして定義されます。
シングルエクスポート機能は良いかもしれ
関数は、通常のコースでの主要な出口点の数を持っている場合は、デバッグが困難になり、その結果を返しますので、より良いかもしれない単一の出口点を維持します。これはまた、いくつかのコードパスを抽出するのに役立ちますし、複数の出口点は、再構成を必要とする可能性があることを意味します。
1 2 3 4 5 6 7 8 9 10 11
|
complex_function DEF(A、B、C): :いない場合は なし#は、例外が良いかもしれない投げ返す :Bされていない場合 返却なし#例外が良いかもしれないスロー
#いくつかの複雑なコードは、xを計算するために、B、Cを試し 成功した、Xを返すように誘惑に抵抗した場合に#を IFないX: X-Bプランの計算について#何か リターンX
|
一般的なPythonのイディオム
1 2 3 4 5 6
|
列挙(some_list)でのインデックス、アイテム: #は、インデックスを使用して、いくつかの作業項目を行う、B = Bを、
A(B、C)= 1、(2,3)
|
1 2
|
ファイル名= 'foobar.txt' ベース名、__、EXT = filename.rpartition( '')
|
1
|
【はxrangeで[] __(4)] = four_lists
|
1 2
|
文字= [ 'S'、 'P'、 ''、 'M'] ワード= '' .join(文字)
|
- コレクション(コレクション)内でアイテムを探します
1 2 3 4 5 6 7 8
|
S =セット([ 'S'、 'P'、 ''、 'M']) 、L = [ 'S'、 'P'、 ''、 'M']
デフ(s)はlookup_set: s内のリターン'S'
デフlookup_list(L): Lでリターン'S'
|
次のような場合には代わりに、通常は良いアイデアリストのコレクションや辞書の使用:
コレクションは、多数の項目が含まれてい
ますが、総額で重複するアイテムを見つける
あなたは、重複したエントリを持っていません
あなたは明示的に値がTrueでない、もしくはなし、または0を比較する必要はありません。
悪いです
1 2 3 4 5
|
:attrの==真の場合 、印刷「真!」
if attr == None: print 'attr is None!'
|
优雅
1 2 3 4 5 6 7 8 9 10 11
|
# 检查值 if attr: print 'attr is truthy!'
# 或者做相反的检查 if not attr: print 'attr is falsey!'
# or, since None is considered false, explicitly check for it if attr is None: print 'attr is None!'
|
访问字典元素
糟糕
1 2 3 4 5
|
d = {'hello': 'world'} if d.has_key('hello'): print d['hello'] # 打印 'world' else: print 'default_value'
|
优雅
1 2 3 4 5 6 7 8
|
d = {'hello': 'world'}
print d.get('hello', 'default_value') # 打印 'world' print d.get('thingy', 'default_value') # 打印 'default_value'
# Or: if 'hello' in d: print d['hello']
|
在每次函数调用中,通过使用指示没有提供参数的默认参数 None 通常是 个好选择),来创建一个新的对象。
举例:
1 2 3
|
def append_to(element, to=[]): to.append(element) return to
|
你可能认为
1 2 3 4 5
|
my_list = append_to(12) print my_list # [12]
my_other_list = append_to(42) print my_other_list # [42]
|
实际结果为
当函数被定义时,一个新的列表就被创建一次 ,而且同一个列表在每次成功的调用中都被使用。
当函数被定义时,Python的默认参数就被创建 一次,而不是每次调用函数的时候创建。 这意味着,如果你使用一个可变默认参数并改变了它,你 将会 在未来所有对此函数的 调用中改变这个对象。
迟绑定闭包
举例
1 2 3 4 5
|
def create_multipliers(): return [lambda x : i * x for i in range(5)] for multiplier in create_multipliers(): print multiplier(2)
|
你期望的结果
实际结果
五个函数被创建了,它们全都用4乘以 x 。
Python的闭包是 迟绑定 。 这意味着闭包中用到的变量的值,是在内部函数被调用时查询得到的。
这里,不论 任何 返回的函数是如何被调用的, i 的值是调用时在周围作用域中查询到的。 接着,循环完成, i 的值最终变成了4。
这个陷阱并不和 lambda 有关,不通定义也会这样
1 2 3 4 5 6 7 8 9
|
def create_multipliers(): multipliers = []
:Iの範囲内(5)のための デフ乗数(X): リターン私は、x * multipliers.append(乗算器)
リターン乗算器
|
ソリューション
最も一般的な解決策は、(ハック)少しトリッキーであると言うことができます。Pythonは行動の関数としてデフォルトパラメータの割り当てを持っているので、あなたはこのように、結合パラメータの即時閉鎖を作成することができます。
1 2
|
DEF create_multipliers(): 戻り、λX、iは= I:範囲(5)にiについてXを*]
|
また、function.partial
機能
1 2 3 4 5
|
functoolsから部分インポート オペレータ輸入MULから
DEF create_multipliers(): [(5)の範囲でiについて部分(MUL、I)]を返します
|
オリジナル:ビッグボックス Pythonの読書ノートのためのベストプラクティスガイド