Python控除の最も包括的な使用法

序文

この記事のテキストと写真はインターネットからのものであり、学習とコミュニケーションのみを目的としています。これらは商用目的ではありません。ご不明な点がございましたら、処理についてお問い合わせください。

PS:Pythonの学習教材が必要な場合は、以下のリンクをクリックして自分で入手できます

Pythonの無料学習資料とグループコミュニケーションの回答クリックして参加


1.Pythonic-非常にPythonic

1から100までの数の二乗のリストを生成するコードを記述します。答えは次のとおりです。

1,4,9,16...

このように書くと、Pythonicにはなりません。

nums = []
for i in range(1,101):
    nums.append(i*i)
print(nums)

正しい書き方は、Pythonの推論を使用することです。

nums = [i*i for i in range(1,101)]

2.条件付き派生

3の倍数である1から100までの数値を含むリストを生成する方法。

9,36,81...

コード:

nums = [i*i for i in range(1,101) if i%3==0]

3.条件式

リストを生成します。3の倍数の場合は正方形を使用し、そうでない場合は数値自体を使用します。

1,2,9,4,5,36...

コード:

nums = [i*i if i%3==0 else i for i in range(1,101)]

上記の3つの例を組み合わせて、推定された要約を見てみましょう。

  • 控除式は、列挙可能なデータ(リスト、タプル、セット、辞書など)からリストを導き出します。ジェネレータ、セット、または辞書を導出することも可能です。
  • 微分式は、微分条件を追加でき、条件を満たす要素のみを微分できます。
  • 派生する要素は式を使用して生成され、ifelseを使用してさまざまな要素を生成できます。
[表达式 if 表达式条件 else 分支 for i in 序列 if 推导条件]

4.関数を使用する

導出条件や式が特に複雑な場合はどうなりますか?関数を使用できます。

1〜100のすべての素数を導きます:2、3、5、7 .. ..

def is_prime(num):
    if num == 1:
        return False  
    for i in range(2,num):
       if (num % i) == 0:
           return False
    else:
       return True

p_nums = [i for i in range(1,100) if is_prime(i)]
print(p_nums)

演繹条件を関数に入れると、複雑な条件を処理できるだけでなく、演繹の簡潔な表記を使用することもできます。

同様に、導出結果を生成するプロセスが複雑な場合は、関数にロジックを配置することもできます。

1900年から2021年までのすべての年を導き出し、うるう年をマークして、結果を生成します。

1900, 1901, 1902, 1903, '闰1904'

コード:

def is_run(year):
    if (year % 4) == 0:
       if (year % 100) == 0:
           if (year % 400) == 0:
               return True   # 整百年能被400整除的是闰年
           else:
               return False
       else:
           return True       # 非整百年能被4整除的为闰年
    else:
       return False 

ryears = [f'闰{y}' if is_run(y) else y for y in range(1900, 2021)]    
print(ryears)

5.ネストされた式-推奨されません

2000年から2021年まで、毎月生成:「2000:1月」、「2000:2月」、「2020:3月」、...、「2021:12月」

monthes = [f'{y}年:{m}月' for y in range(2000, 2022) for m in range(1,13) ]

次のような2つのforループがあります。

monthes = []
for y in range(2000, 2022):
    for m in range(1,13):
        monthes.append(f'{y}年:{m}月')

6.巨大なリストを導き出します-これをしないでください!

10億から100億の間の数の二乗を導き出し、コードは次のようになります。

nums = [i*i for i in range(1,10000000000)]

ただし、コンピューターがスーパーコンピューターでない限り、このコードによってコンピューターがフリーズする可能性があります。メモリ内で100億の計算を実行し、これらの100億の数値を保存する必要があるためです。

7.ジェネレーターを使用する

この場合、控除ジェネレータを使用する必要があります。使用法は非常に簡単です。

  • 角括弧を括弧に変更するだけです
nums = (i*i for i in range(1,10000000000))
print(nums)
print(next(nums))
print(next(nums))
print(next(nums))

印刷されたのはジェネレーターです:

<generator object <genexpr> at 0x7fa0b422feb0>
1
4
9

これはジェネレーターです。一度に100億個の数値を生成することはありません。next()が呼び出された場合にのみ、新しい数値が生成されて返されます。つまり、同時に保存される番号は1つだけです。

8.辞書を導き出す

辞書を導出する方法は、リストの方法と非常に似ていますが、次の点が異なります。

  • 中かっこを使用する
  • キーと値のペアを使用して
    、数値と数値の二乗で構成される辞書導出すると、結果は次のようになります。
{1: 1, 2: 4, 3: 9, ..., 100: 10000}

コード:

nums_dict = {n:n*n for n in range(1,101)}
print(nums_dict)

逆に、正方形は前面にあり、数字は背面にあります。

nums_dict = {n*n:n for n in range(1,101)}
print(nums_dict)

次の辞書をスコアで並べ替えます。

{'麦叔':59, '张三':87, 'FGA':78, '石石':100, '莫名':90}

結果の並べ替え:

{'石石': 100, '莫名': 90, '张三': 87, 'FGA': 78, '麦叔': 59}

コード:

scores = {'麦叔':59, '张三':87, 'FGA':78, '石石':100, '莫名':90}
sored_scores = {item[0]:item[1] for item in sorted(scores.items(), key=lambda item:item[1], reverse=True)}
print(sored_scores)

1.最初に辞書のスコアをタプルのリストに変換します:scores.items()
2。ソートされた関数を使用してタプルのリストをソートします:sorted(scores.items()、key = lambda item:item [1]、reverse = True)
3。ソートプロセスで、ラムダを使用してソートするタプルの2番目の列を指定します:key = lambda item:item [1]。デフォルトは最初の列です。
4.逆の順序を指定しますつまり、スコアが高いほど前になります。reverse= True
5.推論を使用して、タプルのソート済みリストを生成し、新しいソート済み辞書を生成します。{item [0]:item [1]のアイテムの場合...}

9.セットの導出

セットを導出する方法はリストと同じですが、違いは次のとおりです。

1.辞書の導出と同様に中括弧を使用しますが、これは単一の要素であり、キーと値のペアではありません。
2.コレクションは、重複する要素を自動的に除外します。
次の名前のリストは、先頭と末尾のスペースを削除した後、重複する名前を削除します。

[ '麦叔', '张三', ' 麦叔 ', 'FGA ', '张小三', 'FGA', '石石',' 莫名','莫名' ]

導出結果:

{'石石', 'FGA', '张小三', '莫名', '张三', '麦叔'}

コード:

names = [ '麦叔', '张三', ' 麦叔 ', 'FGA ', '张小三', 'FGA', '石石',' 莫名','莫名' ]
new_names = {n.strip() for n in names}
print(new_names)

おすすめ

転載: blog.csdn.net/pythonxuexi123/article/details/112846507