ホームページ >バックエンド開発 >Python チュートリアル >Pythonでコーディングする際の注意点をまとめます。

Pythonでコーディングする際の注意点をまとめます。

零下一度
零下一度オリジナル
2017-06-27 09:56:021236ブラウズ


1.map、filter、reduce
1) map(func, input_list)
次のように関数を入力リストの各要素に適用します:
input_list = [1, 2, 3, 4, 5]


def pow_elem(x):
"""
x の累乗を拡張します
:param x:
:return:
"""
return x * x


def multi_x_y(x, y):
return x * y


プリントマップ(pow_elem, input_list) # 出力:[1, 4, 9, 16, 25]

プリントマップ(multi_x_y, input_list, input_list) # 出力:[1, 4, 9, 16, 25]

2) filter(func_or_none, sequence)
関数の戻り値 True を満たすシーケンス内の値をフィルタリングし、次のような新しいシーケンスの戻り値を形成します。
def is_odd(x):
"""
x かどうかを判断します。は奇数です
: param x:
:return:
"""
return True if x % 2 > 0 else False

print filter(is_odd, input_list) # 出力: [1, 3, 5]

3)reduce(function, sequence)
reduce()関数が受け取るパラメータはmap()、関数f、リストと似ていますが、reduce()で渡される関数fとは動作が異なります。 ) は 2 つのパラメータを受け取る必要があり、reduce() は要素ごとに関数 f を繰り返し呼び出し、最終的な結果値を返します。例:reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) は ((((1+2)+3)+4)+5)
print reduce( lambda x, y: x * y, input_list) # 出力: 120

2. 三項演算
次の 2 つの書き方は同等です:
"Yes" if 2==2 else "No"
("No", "Yes ")[2==2]
つまり:
1) 条件が true の場合、else 条件が false の場合
2) (if_test_is_false, if_test_is_true)[test]
1) と 2) は両方とも 3 項演算を実装できますが、2) は相対的にまれで、あまり洗練されておらず、2) は次のように短絡操作ではありません:
5 if True else 5/0 # 出力: 5
(1/0, 5)[True] # throwException-> ZeroDivisionError: 整数の除算またはゼロによるモジュロ

3. Decorator
1) Python では、次のように関数を定義し、関数内で呼び出すことができます:
def hi(name="patty"):
print("now you hi() 関数内にあります ") GDef Greet ():

Return" これで、greet () 関数内にいます "


def Welcome ():

Return" 今、あなたは Welcome () 関数内にいます "


Print (GREET ())

print(welcome())

print("now you are back in the hi() function")
出力結果は次のとおりです。
今、hi() 関数の中にいます
今、あなたはwelcome() 関数
今、welcome() 関数にいます
今、hi() 関数に戻っています

2) 次のように、内部関数を返し、外部関数を使用してそれを呼び出すこともできます:

def hi(name="patty"):

defgreet():
def using using using def using using ‐ ‐ ‐ ‐def ‐ return ‐ def welcome():
ようこそ

印刷こんにちは() #
print hi()() # これで、greet() 関数に入ります

上記のコードでは、hi() 呼び出しは関数オブジェクトを返します。if/else から判断できます。このステートメントでは、greet() 関数が返されることを示しています。hi()() を呼び出すと、実際には内部関数greet() が呼び出されます。

3) 関数をパラメータとして別の関数に渡します。例:

def hi():
return "hi patty!"

def doSomethingBeforeHi(func):

print("実行前に退屈な作業をしていますhi ()")

print(func())

doSomethingBeforeHi(hi)

出力結果:

hi()を実行する前に退屈な作業をしています
hi patty!
この時点で、単純なデコレータを実装しました。 hi() 関数を呼び出す前に、行を出力します。実際のアプリケーションでは、これはいくつかの前処理操作である可能性があります。実際、デコレータの機能は、コア ロジックの実行前後にいくつかの共通関数を追加することです。

4) 単純なデコレーターの実装
def a_new_decorator(a_func):

def WrapTheFunction():
print("I am doing some beautiful work before executing a_func()")

a_func() # この関数を呼び出します

print("a_func() を実行した後、退屈な作業を行っています")


return WrapTheFunction

def a_function_requiring_decoration():

print("私は悪臭を取り除くために何らかの装飾が必要な関数です")

a_function_requiring_decoration ( )

#outputs: "私は、悪臭を取り除くために何らかの装飾が必要な関数です。"

a_function_requiring_decoration = a_new_decorator(a_function_requiring_decoration)
#現在、a_function_requiring_decoration は WrapTheFunction() によってラップされています

a_function_requiring_decoration()
# a_func() を実行する前に退屈な作業をしています
# 悪臭を取り除くために装飾が必要な関数です
# a_func() を実行した後に退屈な作業をしています

5) 注意事項Form
@a_new_decorator
def b_function_requiring_decoration():
print("私は悪臭を取り除くために何らかの装飾が必要な別の関数です")

b_function_requiring_decoration()
# a_func() を実行する前に退屈な作業をしています
#私は、悪臭を取り除くために何らかの装飾が必要な別の関数です
# a_func() を実行した後、退屈な作業を行っています
ここで @a_new_decorator は、a_new_decorator(b_function_requiring_decoration) と同等です

6) 4) a_function_requiring_decoration の名前
を取得します実際、取得したいのは、a_func に対応する a_function_requiring_decoration 関数名であり、この問題を解決するためのラップを提供します。
functools import Wraps から
def a_new_decorator(a_func):
@wraps(a_func)
def WrapTheFunction():
print("a_func() を実行する前に退屈な作業をしています")

a_func()

print( "a_func() の実行後に退屈な作業を行っています")

return WrapTheFunction

7) デコレーターのいくつかのアプリケーション シナリオ
ユーザー認証
def require_auth(f):
@wraps(f)
defdecorated(*args , **kwargs):
auth = {"username": "patty", "password": "123456"}
そうでない場合 check_auth(auth['username'], auth['password']):
authenticate()
return f(*args, **kwargs)

def check_auth(ユーザー名, パスワード):
off else False

defauthenticate():
print "認証済み"
returndecorated

@requires_auth

def welcome() :
return "ようこそパティ!"

print welcome()

logging

def logit( func):
@wraps(func)
def with_logging(*args, **kwargs):
print(func.__name__ + " ")
return func(*args, **kwargs)
return with_logging

@ logit

def add_func(x):
"""いくつかの計算をしてください。"""
return x + x

result = add_func(4)
は次のように出力されます。
def Wrap_function(*args, **kwargs):

log_string = func.__name__ + " が呼び出されました"

print(log_string) Opened_file.write(log_string + 'n') W Returnipped_function
returnlogging_Decorator

@logit ()
Def myfunc1 ():
Pass

myfunc1 ()
# OUNC1 WAS Called
# 上記の文字列を持つ OU T.LOG というファイルが存在します

@@@@ t logit(logfile='func2.log' )
def myfunc2():
pass

myfunc2()


9) クラスをデコレータとして使用
import os

class Logit(object):

def __init__(self, log_file) (log_msg) R Fout.write (OS) .LINESEP)
# さあ、通知を送信します
Self.notify ()

Def Notify (Self):
# Logit のみのログ、これ以上は不要です
pass

class EmailLogit(Logit):
'''
関数が呼び出されたときに管理者に電子メールを送信するための Logit 実装

''''
def __init__(self, log_file, email='admin@myproject.com') : A Self.email = Email
Super (emailogit, self) .__ init __ (log_file)

Def Notice (self):

# self.email にメールを送信
# With Open (Self.log_file, 'a' ) as f:
f.write("Do Something...")
f.write(os.linesep)
f.write(" (os.linesep)


@Logit("log1.txt")

def myfunc3():

pass

@EmailLogit("log2.txt")
def myfunc4():

pass

クラスをデコレータとして使用すると、コードがより簡潔に見えます。また、継承。

4. 変数の型
Python の変数の型には、

>>> のように変更可能です。 ['パティ']

>>> foo
['hi', 'patty']
>>> foo[0]='こんにちは'
>>> ', 'パティ']

>>> fdict = {"名前":"パティ"}
>>> fdict.update({"年齢":"23"})
>> ;> fdict
{'年齢': '23', '名前': 'パティ'}

>>> fdict.update({"年齢":"25"})

> fdict
{'age': '25', 'name': 'patty'}

このメソッドでは、受信パラメータが変数型でデフォルト値が割り当てられている場合、次の状況が発生することに注意してください。 >> def add_to(num, target=[]):
... target.append(num)
... return target
...

>>> add_to(1)

;
>>> add_to(2)
[1, 2]
>>> add_to(3)
[1, 2, 3]
これは、デフォルトのパラメーターが Cannot メソッドで定義されているためです。呼び出されるたびに再計算されるのではなく、呼び出されます。したがって、上記の状況を回避するために、メソッドが呼び出されるたびに新しい空のリストを使用して計算する場合は、次のように記述できます。
>>> :
... target が None の場合:
... target = []
... target.append(num)
... return target
...
>>> add_to(1)
; [1]
>>> add_to(2)
[2]

5. 浅いコピーと深いコピー
Pythonでは、オブジェクトの代入とコピー(深い/浅いコピー)には違いがあります。使用時に注意しないと、予期しない結果が発生する可能性があります。
1) Python のデフォルトのシャローコピーメソッド
>>> foo = ['hi']
>> bar = foo

>>> id(foo)

4458211232
> >> id(バー)
4458211232
>>> bar.append("パティ")
>>> バー
>>> foo
['hi', 'patty']
注: id(foo)==id(bar)、foo と bar が同じオブジェクトを参照することを示します。bar 参照を通じてリストに対して追加操作が実行されると、ポインテッドは同じメモリ空間であるため、foo の出力は bar の出力と一致します。

2) ディープコピー
>>> foo
['hi', {'age': 20, 'name': 'patty'}]
>>> インポートコピー
>> > 遅い = copy.deepcopy(foo)
>>> 遅い

['hi', {'age': 20, 'name': 'patty'}]

>>> ]='こんにちは'
>>>遅い
['こんにちは', {'年齢': 20, '名前': 'パティ'}]
>>> foo
['こんにちは', { 'age': 20, 'name': 'patty'}]
注: low は foo のディープ コピーであるため、実際にはメモリ内に新しいスペースを開き、foo オブジェクトによって参照されるコンテンツを新しいスペースにコピーします。したがって、slow オブジェクトによって参照されるコンテンツが更新された場合、その変更は、slow オブジェクトの参照にのみ反映され、foo オブジェクトによって参照されるコンテンツは変更されません。

6. コレクション
1) defaultdict
通常の辞書の場合、存在しないキーを取得すると、次のように KeyError がトリガーされます:
some_dict = {}
some_dict['colours']['favourite'] = " yellow"
# Raises KeyError: 'colours'
しかし、defaultdict を使用すると、次のようにこの状況を回避できます:
import collections
import json
tree = lambda: collections.defaultdict(tree)
some_dict =tree()
some_dict[ 'colours']['favorite'] = " yellow"
print json.dumps(some_dict)
# 正常に動作します。出力: {"colours": {"favorite": " yellow"}}

2) OrderedDict
OrderedDict辞書を定義したときのキーの順序で辞書を出力できますが、value の値を変更してもキーの順序は変更されません。ただし、キーを削除して再挿入すると、キーの順序が変更されます。辞書の終わり。
コレクションから import OrderedDict

colours = OrderedDict([("Red", 198), ("Green", 170), ("Blue", 160)])
キーの場合は、colors.items() の値:
print(key, value)

3) Counter
Counter を使用して、次のような特定のアイテムの出現数をカウントします。
コレクションからインポート Counter

colours = (
('Yasoob', 'Yellow'),
( 'アリ'、'ブルー')、
('アーハム'、'グリーン')、
('アリ'、'ブラック')、
('ヤソブ'、'レッド')、
('アーメッド'、'シルバー' ') ,
)

favs = Counter(名前には名前、色の色)
print(favs)
# Counter({'Yasoob': 2, 'Ali': 2, 'Arham': 1, 'Ahmed' : 1 })

4) deque
deque は両端キューであり、次のように先頭と末尾でそれぞれ挿入および削除できます。
from collections import deque
queue_d = deque()
queue_d.append( 1)
queue_d.append (2)
print queue_d # deque([1, 2])
queue_d.appendleft(3)
print queue_d # deque([3, 1, 2])

queue_d.pop()
print queue_d # deque([ 3, 1])
queue_d.popleft()
print queue_d # deque([1])

deque は、要素の数が最大長を超える場合、キューの最大長を設定できます。現在の挿入方向とは逆方向から対応する要素が削除されます。要素数は次のとおりです。
queue_c = deque(maxlen=5, iterable=[2, 4, 6])
queue_c.extend([7, 8])
print queue_c # deque([2, 4, 6, 7 , 8], maxlen=5)
queue_c.extend([10, 12])
print(queue_c) # deque([6, 7, 8] , 10, 12], maxlen=5)
queue_c.extendleft([18 ])
print(queue_c) # deque([18, 6, 7, 8, 10], maxlen=5)

5) nametuple
tupleは不変リストであり、タプル内の要素は再割り当てできません。タプル内の要素にはインデックスを介してのみアクセスできます。名前タプルは不変の辞書とみなすことができ、タプル内の要素には名前を介してアクセスできます。例:
from collections importnamedtuple

Animal =namedtuple('Animal', 'name age type')
perry = Animal(name="perry", age=31, type="cat")

print(perry )
# 出力: Animal(name='perry', age=31, type='cat')

print(perry.name)
# 出力: 'perry'

print(perry[0])
# 出力: 'perry'

print(perry._asdict())
# 出力: OrderedDict([('name', 'perry'), ('age', 31), ('type', 'cat')])

7. オブジェクトのイントロスペクション
1) dir: オブジェクトのすべてのメソッドをリストします
2) type: オブジェクトのタイプを返します
3) id: オブジェクトの ID を返します

1) list
> ;>> ; 2 乗 = [範囲 (10) の x の x**2]
>>> 2 乗
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
2) dict
{v: k for k, v in some_dict.items()}
3) set
>>> squared = {x**2 for x in range(10)}
>> ;> 2 乗
set([0, 1, 4, 81, 64, 9, 16, 49, 25, 36])

9. 例外処理

try:
print(' ')
例外 Exception:
print('例外')
else:
# try で例外が発生しない場合にのみ実行されるべきコード,
# ただし例外をキャッチしてはいけないコード
print('This would be例外が発生しない場合にのみ実行され、ここでのエラー '
' は捕捉されません。')
finally:
print('これはあらゆる場合に出力されます。')

# 出力: 例外は発生しないと確信しています。

# これは、例外が発生しない場合にのみ実行されます。
# これは、あらゆる場合に出力されます。
else のステートメントは、finally の前に実行されます。

10. 組み込みメソッド

a_list = [[1, 2], [3, 4], [5, 6]]
print(list(itertools.chain.from_iterable(a_list)))
# 出力: [ 1, 2, 3, 4, 5, 6]

# or

print(list(itertools.chain(*a_list)))
# 出力: [1, 2, 3, 4, 5, 6]


class A(object):
def __init__(self, a, b, c, d, e, f):
self.__dict__.update({k: v for k, v in locals().items() if k != 'self'})

11. for-else ステートメント
for ステートメントを終了するには通常 2 つの方法があります。1 つは特定の条件が満たされたときにループから抜け出す方法で、もう 1 つはすべてを終了する方法です。条件ループ。 for-else の else ステートメントは、次のように、すべての条件が判断され、for ループが正常に終了した場合にのみ実行されます。 module は Python 2+ 環境の Python 3+ モジュールを参照します
2) 互換性のあるモジュールのインポート方法
try:
import urllib.request as urllib_request # Python 3 の場合
ImportError:
import urllib2 as urllib_request # Python 2 の場合

参考:



以上がPythonでコーディングする際の注意点をまとめます。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。