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