Python文法の10の絶妙な知識ポイント(B文法をインストール)


@この記事は公開番号から来ています:csdn2299、公開番号に注目したいProgrammer Academy
Pythonは単純なアイデアを表す言語であり、構文は比較的単純で、簡単に始めることができます。ただし、Pythonの構文の繊細さと深さを過小評価すると、誤りになります。この記事では、Python文法の繊細さを示すことができる10のベストナレッジポイントを注意深く選別し、詳細なサンプルコードを添付します。実際の戦闘で柔軟に統合して使用できる場合、コードは間違いなくより洗練され効率的になり、コードBグリッドも大幅に改善され、読みやすく洗練された外観になります。

1.-その他

え?元の一致であるかどうか。いいえ、あなたは他に2隻のボートに乗る男であることを知らないかもしれません。インストールされている上位10のB文法は、間違いなく南武湾です!それを信じないでください、見てください:

>>> for i in [1,2,3,4]:
    print(i)
else:
    print(i, '我是else')
     
1
2
3
4
4 我是else

forとelseの間に3番目のifがある場合(循環ボディ内)、forとelseの関係には影響しません。forのレベルはifのレベルよりも高いため、elseは権力に執着しており、ifの有無や、if条件を満たすステートメントが実行されるかどうかを気にしません。Elseの目にはforしかありません。forが正常に実行される限り、elseは完全に実行されます。

>>> for i in [1,2,3,4]:
    if i > 2:
        print(i)
else:
    print(i, '我是else')
 
3
4
4 我是else

では、どうやってforを解体するのですか?forループがbreakステートメントによって中断された場合のみ、elseステートメントはスキップされます。

>>> for i in [1,2,3,4]:
    if i>2:
        print(i)
        break
else:
    print(i, '我是else')
 
3

2. 1つ星(*)と2つ星(**)

星(*)は本当に魔法のシンボルです。考えてみてください。CなしでのCの楽しみは何ですか?また、そのため、Pythonはとても上品で、優雅で魅力的です!Python関数はデフォルトパラメータと変数パラメータをサポートしています。1つの星は無制限の数の単一値パラメータを表し、2つの星は無制限の数のキーと値のペアパラメータを表します。

例を見てみましょう:複数の入力値の合計を返す関数を設計します。これらの入力値をリストにして関数に渡すことは確かに可能ですが、この方法はスターの可変パラメーターを使用するよりもはるかに洗練されていません。

>>> def multi_sum(*args):
    s = 0
    for item in args:
        s += item
    return s
 
>>> multi_sum(3,4,5)
12

Python関数を使用すると、固定パラメーター、デフォルトパラメーター、単一値(1つ星)の変数パラメーターのすべてまたは一部、およびキーと値のペア(2つ星)の変数パラメーターをすべてまたは部分的に使用できます。

>>> def do_something(name, age, gender='男', *args, **kwds):
    print('姓名:%s,年龄:%d,性别:%s'%(name, age, gender))
    print(args)
    print(kwds)
 
>>> do_something('xufive', 50, '男', 175, 75, math=99, english=90)
姓名:xufive,年龄:50,性别:男
(175, 75)
{'math': 99, 'english': 90}

さらに、1つの星と2つの星は、C言語のように見えるリスト、タプル、および辞書のアンパックにも使用できます。

>>> a = (1,2,3)
>>> print(a)
(1, 2, 3)
>>> print(*a)
1 2 3
>>> b = [1,2,3]
>>> print(b)
[1, 2, 3]
>>> print(*b)
1 2 3
>>> c = {'name':'xufive', 'age':51}
>>> print(c)
{'name': 'xufive', 'age': 51}
>>> print(*c)
name age
>>> print('name:{name}, age:{age}'.format(**c))
name:xufive, age:51

3.三元表現

C / C ++に精通しているプログラマーは、最初にpythonを使い始めたとき、同じ考えを表現したいのでpythonで書くのは面倒なので、古典的な三項演算子を見逃します。たとえば、次のとおりです。

>>> y = 5
>>> if y < 0:
    print('y是一个负数')
else:
    print('y是一个非负数')
 
y是一个非负数

実際、Pythonは三項式をサポートしていますが、山東省の人々が言うように、少し奇妙です。たとえば、山東省の人々は、逆の文を使用することを好みます:雨が降らない場合は遊びに行き、雨が降った場合は研究室に行きましょう。三項式に変換すると、次のようになります。

雨が降らない場合は書斎へ

三項式の具体的な使用法を見てみましょう。

>>> y = 5
>>> print('y是一个负数' if y < 0 else 'y是一个非负数')
y是一个非负数

Pythonの三項式も割り当てに使用できます。

>>> y = 5
>>> x = -1 if y < 0 else 1
>>> x
1
  1. with-as

withという単語は英語で翻訳するのは難しくありませんが、Pythonの文法で翻訳する方法がわかりません。これは基本的にはコンテキスト管理プロトコルです。初心者の場合、withのさまざまな方法やメカニズムに注意を払う必要はありません。そのアプリケーションシナリオを理解するだけで済みます。withステートメントは、事前に準備して後で処理する必要があるいくつかのタスクに適しています。たとえば、ファイル操作は最初にファイルを開く必要があり、操作が完了したらファイルを閉じる必要があります。withを使用しない場合、ファイル操作は通常次のようになります。

fp = open(r"D:\jb51\Column\temp\mpmap.py", 'r')
try:
 contents = fp.readlines()
finally:
 fp.close()

with-asを使用すると、はるかにエレガントになります。

>>> with open(r"D:\jb51\Column\temp\mpmap.py", 'r') as fp:
    contents = fp.readlines()
  1. リストの理解

あらゆる種類の奇妙な文法の中で、リスト内包の頻度は最も高くなるはずであり、コードを単純化する効果も非常に明白です。たとえば、リストの要素を二乗するには、通常、次のように記述します(もちろん、map関数を使用するなど、他の方法で記述できます)。

>>> a = [1, 2, 3, 4, 5]
>>> result = list()
>>> for i in a:
    result.append(i*i)
 
>>> result
[1, 4, 9, 16, 25]

リスト内包表記を使用すると、はるかに快適に見えます。

>>> a = [1, 2, 3, 4, 5]
>>> result = [i*i for i in a]
>>> result
[1, 4, 9, 16, 25]

実際、派生はリストをサポートするだけでなく、辞書、コレクション、タプルなどのオブジェクトもサポートします。興味があれば一人で勉強できます

6.リストインデックスの様々な操作

Pythonは配列へのインデックスとして負の整数を導入しますが、これは間違いなく大きな動きです。C / C ++では、配列の最後の要素が必要な場合は、最初に配列の長さを取得し、次に配列の長さを引いてからインデックスを付ける必要があります。これは、思考の一貫性に深刻な影響を与えます。Python言語が成功している理由は、個人的にはリスト操作の利便性が無視できないポイントだと個人的に感じています。見てください

>>> a = [0, 1, 2, 3, 4, 5]
>>> a[2:4]
[2, 3]
>>> a[3:]
[3, 4, 5]
>>> a[1:]
[1, 2, 3, 4, 5]
>>> a[:]
[0, 1, 2, 3, 4, 5]
>>> a[::2]
[0, 2, 4]
>>> a[1::2]
[1, 3, 5]
>>> a[-1]
5
>>> a[-2]
4
>>> a[1:-1]
[1, 2, 3, 4]
>>> a[::-1]
[5, 4, 3, 2, 1, 0]

これらに精通しており、頻繁に使用する場合、次の使用法は非常に不思議に感じるでしょう。

>>> a = [0, 1, 2, 3, 4, 5]
>>> b = ['a', 'b']
>>> a[2:2] = b
>>> a
[0, 1, 'a', 'b', 2, 3, 4, 5]
>>> a[3:6] = b
>>> a
[0, 1, 'a', 'a', 'b', 4, 5]

7.ラムダ関数

ラムダは非常に高く聞こえ、実際には匿名関数です(jsが匿名関数に精通している必要があることを知っているクラスメート)。匿名関数の適用シナリオは何ですか?この関数は、無名関数が定義されている場所でのみ使用するためのもので、他の場所では使用されないため、猫や犬などの名前を付ける必要はありません。以下は、合計のための無名関数です。xとyの2つの入力パラメーターがあります。関数本体はx + yであり、returnキーワードは省略されています。

>>> lambda x,y: x+y
<function <lambda> at 0x000001B2DE5BD598>
>>> (lambda x,y: x+y)(3,4) # 因为匿名函数没有名字,使用的时候要用括号把它包起来

匿名関数は通常、単独で使用されるのではなく、他の方法と組み合わせて、組み込みアルゴリズムまたは他の方法の判断条件を提供します。たとえば、sort関数sortedを使用して多次元配列または辞書を並べ替える場合、並べ替え規則を指定できます。

>>> a = [{'name':'B', 'age':50}, {'name':'A', 'age':30}, {'name':'C', 'age':40}]
>>> sorted(a, key=lambda x:x['name']) # 按姓名排序
[{'name': 'A', 'age': 30}, {'name': 'B', 'age': 50}, {'name': 'C', 'age': 40}]
>>> sorted(a, key=lambda x:x['age']) # 按年龄排序
[{'name': 'A', 'age': 30}, {'name': 'C', 'age': 40}, {'name': 'B', 'age': 50}]

今度はmap関数を使用して、配列要素を2乗する別の例を見てみましょう。

>>> a = [1,2,3]
>>> for item in map(lambda x:x*x, a):
    print(item, end=', ')
 
1, 4, 9,

8.イールドとジェネレーターとイテレーター

「降伏」という言葉は翻訳するのが本当に難しく、辞書を回しても意味がありません。私は単に「One Love」を外国語として読みました。収量を理解するには、まずジェネレーター(ジェネレーター)を理解する必要があります。ジェネレータを理解するには、最初にイテレータ(イテレータ)を知っている必要があります。ははは、ハロ?忘れてください、私はまだ言葉を使っています。

py2の時代では、範囲()はリストを返しますが、範囲(10000000)の場合は大量のメモリリソースを消費するため、この問題を解決するためにpy2には別のxrange()があります。py3はxrange()のみを保持しますが、範囲()を書き込みます。xrange()が返すのはイテレータで、リストのようにたどることができますが、多くのメモリを消費しません。ジェネレーター(ジェネレーター)は、1回しかトラバースできない特別なイテレーターで、トラバースが終了すると、自動的に消えます。つまり、イテレータとジェネレータの両方がリストの使用を避け、メモリを節約するように設計されています。では、イテレータとジェネレータを取得するにはどうすればよいですか?

Pythonには、反復関数の生成に使用される組み込みの反復関数iterがあります。

>>> a = [1,2,3]
>>> a_iter = iter(a)
>>> a_iter
<list_iterator object at 0x000001B2DE434BA8>
>>> for i in a_iter:
    print(i, end=', ')
 
1, 2, 3,

Yieldはジェネレーターの構築に使用されます。たとえば、0から正の整数までのすべての整数の2乗を返す関数を記述したい場合、従来のコードは次のように記述されます。

>>> def get_square(n):
    result = list()
    for i in range(n):
        result.append(pow(i,2))
    return result
 
>>> print(get_square(5))
[0, 1, 4, 9, 16]

ただし、1億以内のすべての整数の2乗を計算すると、この関数のメモリオーバーヘッドは非常に大きくなります。これは歩留まりであり、スキルを示すことができます。

>>> def get_square(n):
    for i in range(n):
        yield(pow(i,2))
 
>>> a = get_square(5)
>>> a
<generator object get_square at 0x000001B2DE5CACF0>
>>> for i in a:
    print(i, end=', ')
 
0, 1, 4, 9, 16,

もう一度トラバースすると、出力はありません。

9.デコレータ

イテレータとジェネレータを考え出したところ、これは別のデコレータです。Pythonデバイスの数はいくつですか。実際、Pythonは多くの武器を提供しており、デコレータは最も強力な武器の1つです。デコレーターは非常に強力です。デコレーターの使用と製造プロセスを説明するために、需要の観点から簡単な例を使用してみます。

多くの関数を定義する必要がある場合は、各関数の実行時にこの関数の実行時間を表示する必要があり、多くの解決策があります。たとえば、各関数を呼び出す前にタイムスタンプを読み取ってから、各関数の実行後にタイムスタンプを読み取って、その違いを見つけることができます。また、各関数本体の先頭と末尾のタイムスタンプを読み取って、最後に見つけることもできます。悪い。ただし、これらの2つの方法は、デコレータを使用するほど単純でエレガントではありません。次の例はこれを非常によく示しています。

>>> import time
>>> def timer(func):
    def wrapper(*args,**kwds):
        t0 = time.time()
        func(*args,**kwds)
        t1 = time.time()
        print('耗时%0.3f'%(t1-t0,))
    return wrapper
 
>>> @timer
def do_something(delay):
    print('函数do_something开始')
    time.sleep(delay)
    print('函数do_something结束')
 
     
>>> do_something(3)
函数do_something开始
函数do_something结束
耗时3.077

Timer()は定義したデコレータ関数です。@を使用して関数(do_somethingなど)の定義の前に追加することは、新しく定義した関数をデコレータ関数の入力パラメータとして使用することと同じです。do_something()関数の実行は、タイマー(do_something)の実行として理解できます。詳細は複雑ですが、この理解はそれほど逸脱することはなく、デコレータの製造と使用を把握するのは簡単です。

10. assert assertの賢い使い方

いわゆるアサーションは、式のブール値がtrueでなければならないことを宣言することです。そうでないと、AssertionError例外がトリガーされます。厳密に言うと、assertはデバッグメソッドであり、運用環境では使用しないでください。ただし、これは、入力パラメーターの形式や型の検証など、特定の機能を実現するためのアサーションの使用には影響しません。

>>> def i_want_to_sleep(delay):
    assert(isinstance(delay, (int,float))), '函数参数必须为整数或浮点数'
    print('开始睡觉')
    time.sleep(delay)
    print('睡醒了')
 
     
>>> i_want_to_sleep(1.1)
开始睡觉
睡醒了
>>> i_want_to_sleep(2)
开始睡觉
睡醒了
>>> i_want_to_sleep('2')
Traceback (most recent call last):
 File "<pyshell#247>", line 1, in <module>
 i_want_to_sleep('2')
 File "<pyshell#244>", line 2, in i_want_to_sleep
 assert(isinstance(delay, (int,float))), '函数参数必须为整数或浮点数'
AssertionError: 函数参数必须为整数或浮点数

読んでいただきありがとうございます
。大学でpythonを学ぶことを選んだとき、コンピュータの基礎がおかしいことに気付きました。学業資格はあり
ませんでした。これは何もする必要はありません。それを補うことしかできません。道は、Pythonのコア知識を学び続け、コンピューターの基礎の詳細な研究を整理し、平凡になりたくない場合は、コーディングに参加して成長を続けてください!
実はここには技術だけでなく、それ以外のものもあり、たとえばプログラマーそのものが高貴な存在である「コックシルク」ではなく、どうすれば絶妙なプログラマーになれるのでしょうか。[参加するにはクリックしてください]自分らしくなりたい、高貴な人になりたい、是非!

元の記事64件を公開 賞賛された37件 40,000回以上の閲覧

おすすめ

転載: blog.csdn.net/chengxun03/article/details/105694621