Pythonの基本的な関数プログラミングのパートコーミングを学ぶ

セクションIX /セクションX

三項操作【三眼操作】

  • 構文:
    • "v = a if a> b else b"#自己要約:条件が満たされたときにaを返し、条件が満たされていないときにbを返します

機能

1.関数の基本

1.1機能の基本構造

def 函数名(参数):
    #函数内容
    pass
函数名(参数) # 执行函数 

1.2戻り値

  • 戻り値、関数はデフォルトでNoneを返します
def func():
    reuturn 1,3,"abc" #这种情况会自动转换为元组返回

1.3関数パラメーター

  • 渡される関数パラメーターとは何ですか?[メモリアドレス=参照]
  • 任意の数
  • すべてのタイプ
  • 位置参照
def func(name,age,gender):
    pass
func("伊万科夫",25,"人妖")
  • Pass-by
    キーワードとPass-by キーワードと位置、positionパラメータは前にある必要があり、keywordパラメータは後ろにあります
  • パラメータのデフォルト値[定義]
    &デフォルト値が変数タイプの場合---》ピット
#该部分代码解释了为什么默认值慎用可变类型
def func(data,value=[]):
    value.append(data)
    return value
v1=func(1) #[1,]
v2=func(1,[11,22,33]) # [11,22,33,1]
v3=func(2) # [1,2]
print(v1) #[1,2]
def func(name,age,gender='男'):
    pass
func("伊万科夫",25,gender="人妖")
func("伊万科夫",gender="人妖",25)  # 错误方式
func("伊万科夫",25)     # gender不传的情况下使用默认值 “男”
  • ユニバーサルパラメータ
    • * argsは任意の数の位置パラメーター
      を受け取り、任意の数のパラメーターを受け取ることができ、すべてのパラメーターをタプルに変換します

      def func(*args): # 将所有参数打包成元组传递
          print(args)
      v1 = func((11,22,33,44,55)) #将参数元祖作为整个元组的第一个参数
      print(v1) # ((11,22,33,44,55),)
      v2 = func(*(11,22,33,44,55))# 将元组元素打散再打包成元组传递
      print(v1) # (11,22,33,44,55)
      #**********************************************************
      def func(*args,**kwargs):
          print(args)
          print(kwargs)
      func(*(11,"aaa"),444,"abc",name="沙鳄鱼",age='30')
      """
      (11, 'aaa', 444, 'abc')
      {'name': '沙鳄鱼', 'age': '30'}
      """
      
    • ** kwargsは任意の数のキーワードパラメーター
      を受け取り、キーワードパラメーターを受け取ります。キー値は辞書に変換されます

      def func(**kwargs):
          print(kwargs)
      func(k1="v1",k2="v2")  #转换字典{"k1":"v1","k2":"v2"}
      func(**{"k1":"v1","k2":"v2"})  #直接传递字典{"k1":"v1","k2":"v2"}
      #**********************************************************
      def func(*args,**kwargs):
          print(args)
          print(kwargs)
      func((11,"aaa"),444,"abc",name="沙鳄鱼",age='30')
      """
      ((11, 'aaa'), 444, 'abc')
      {'name': '沙鳄鱼', 'age': '30'}
      """
      

1.4関数スコープ

  • グローバルスコープ
  • ローカルスコープ
  • 要約:
    • 1つの機能と1つのスコープ
    • スコープ内のデータを検索するためのルール:自分のスコープ内を調べ、親に沿った検索で見つけることができない
    • 子スコープは親変数の値のみを使用でき、親変数の値を再割り当てできません[変数の再割り当ては、子スコープでの新しい変数の定義と同等です]
    • 変数型変数の場合、サブスコープはそれを変更できます
    • グローバル変数に値を割り当てる必要がある場合は、グローバルキーワードを使用してグローバル変数を見つける必要があります
name = 'enki'
def func():
    global name # global 关键字 只找全局的变量 【global关键字只查找全局中的变量】
    name = 'alex' 
- 查找父级【上一级】的变量
# 使用关键noglobal关键字
  • 変数の命名規則
    • すべての大文字のグローバル変数
    • すべて小文字のローカル変数

セクション11 /セクション12

1.小さなシニア機能

1.1機能の割り当て

  • 関数名の割り当て
def func():
    pass
v1 = func 
v1()
  • 関数はリスト、辞書、セット、タプルに入れることができ、辞書のキーと値としても使用できます
  • 関数名は変数名として使用できます
  • 関数はパラメーターとして渡すことができます
def func(arg):
    print(arg)
 def show():
    return 9
func(show)
def func(arg):
    arg() #执行函数
 def show():
    print("执行show函数")
func(show)	

1.2ラムダ式

  • 基本的な表現
    &単純な関数を表すために使用、[関数内に複雑なコードはなく、単純な戻り値のみ]
def func(a,b):
    return a + b
func1=lambda a,b:a+b
func2=lambda : 100
func3=lambda a: a+100
func4=lambda *args,**kwargs: len(args)
#默认会将":"后的结果作为返回

ラムダ式は変数を定義できません。自分で変数を検索し、そうでない場合は親を検索してください[ラムダ式は1行の関数です]

#一行实现比较两个值大小,返回大的值
func = lambda a,b: a if a > b else b
n = func(33,5)
print(n)

1.3組み込み関数

  • カスタム機能
  • 組み込み関数
    • 必須の型変換[int、str、bool、list、tuple、dict、set]

    • 数値相関[最大()、最小()、浮動小数点()、abs():絶対値を検索、合計()]

      • divmod():2つの値を除算して商と余りを取得します[ページングに使用]
      • ラウンド():変換では、複数の売上が保持され、丸められます
    • 入出力【印刷・入力】

    • ベース関連

      • binバイナリ変換、0bで始まる
      • 8進8進0o開始
      • int decimal
      • hex hex 0x
      # 二进制转十进制
      v1 = '0b1101'
      result = int(v1,base=2)
      print(result)
      # 八进制转十进制
      v1 = '0o1101'
      result = int(v1,base=8)
      print(result)
      # 十六进制转十进制
      v1 = '0x1101'
      result = int(v1,base=16 )
      print(result)
      
    • その他【type、len、range、open、id】

    • コーディング関連

      • chr()#10進数に基づいてUnicodeエンコーディングで対応する文字を検索します
      • ord()#文字に応じて、Unicodeエンコーディングで対応する10進数を検索します
      • アプリケーション:ランダム検証コードの生成[ランダムに数値を返すランダムモジュールrandom.randint(10,50)を導入]
    • 高度な組み込み関数

      • map(func、v1)[プロセスデータ]
        &funcは関数、V1は反復可能な型データ、map()関数はV1パラメータの各要素をループすることにより、各要素に関数func、func関数を実行させます結果は新しいリストに追加されて返されます。
      v1 = [11,22,33,44]
      result = map(lambda x: x+100,v1)
      print(list(result)) # 特殊 ,result是一个object对象
      
      • filter(func、v1)[filter data]
        &v1パラメータの各要素をループし、func関数に渡して実行します。func関数がTrueを返した場合、要素を新しいリストに追加します。
      • reduce(func、v1)[統合データ]
        &v1パラメーターの各要素をfunc関数にループして実行し、func関数の最終的な実行結果を返します; [func関数には2つのパラメーターが必要で、最初のパラメーターは関数の前にあります1回の実行の戻り値]
        &python3はモジュールをインポートする必要がありますimport functools
      v1 = [1,2,3,4,5]
      result = reduce(lambda x,y: x+y,v1)
      print(result)
      

2.高度な機能

2.1関数は値を返します

  • 閉鎖
    • 独自のデータ(独自に使用するための内部変数)を維持するための関数用のメモリ空間を作成し、後の関数の実行を容易にし、[アプリケーションシナリオ:デコレータ/ SQL Alchemyソース]を呼び出します。
    • 関数の作成者、関数の実行開始場所
    • クロージャ関数:関数が呼び出されるたびに、この呼び出しのためにメモリが開かれ、メモリは後で使用する値を保存できます
  • 関数をパラメーターとして渡す
  • 関数を戻り値として扱う
  • 注:関数を割り当てます
  • 執行機能
    • 関数は呼び出されず、内部コードは実行されません
    • 関数が実行されると、自身の関数実行の情報を保存するためにメモリが作成されます[クロージャ]
      #関数によって開かれたメモリの名前は使用されず、クロージャではありません

2.2再帰

  • 再帰のデフォルトの最大数は1000で、sysモジュールのメソッドで調整できますが、効率は低くなります
def func(a):
    if a ==5:
        return 100000
    result = func(a+1) + 10
    return result
v = func(1) # 100050

2.3暗号化モジュール

  • hashlibモジュール
import hashlib
def get_md5(data):
    obj = hashlib.md5("一套随机字符串",encode='utf-8')
    obj.update(data.encode('utf-8')) #python3需要加编码指定
    result = obj.hexdigest()
	return result
  • パスワードが表示されない、モジュールgetpass
import getpass
pwd = getpass.getpass('请输入密码:') #密码隐藏不显示
#在终端输入运行(pycharm无法运行不行)
 # getpass 在pycharm终端无法直接运行,如果需要请在命令行或者下方terminal窗口输入py文件运行

セクションXIII /セクションXIV

1.デコレータ

  • 関数:元の関数の元のコードを変更しないことに基づいて、関数実行の前後に関数を自動的に実行します
  • デコレータを書く:
    • @xの役割:
      &1. x関数を実行し、次のfunc1関数をx関数のパラメーターとして渡します。
      &2. x関数実行の戻り値を次のfunc1関数名に割り当てます
#装饰器的编写
def x(func):
    def y():
        ret = func()
        return ret
    return y

#装饰器的应用
@x
def func1():
    pass
@x 
def func2():
    pass
  • アプリケーションシナリオ:1つまたは複数の関数のパブリック関数拡張に使用されます。
  • デコレータ形式:
def 外层函数(参数):
	def 内层函数(*args,**kwargs):#注意万能参数传递
        return 参数(*args,**kwargs)#注意万能参数传递
    return 内层函数

@外层函数
def index():
    pass
index()

2.派生

  • リストの理解
    • 基本フォーマット:変数= [forループの変数、forループは反復可能なオブジェクト]
vals = [ i for i in 'alex' ]
v1 = [i+100 for i in range(10)]
v2 = [100 for i in range(10)]
v3 = [99 if i >5 else 66 for i in range(10)]
i = [lambda:100+i for i in range(10)]
v4[0]() #109
v = [i for i in range(10) if i > 5]
# 条件成立才append进去
  • Set derivation
    &v1 = {i for i in 'alex'}#違いはset deduplicationです
  • 辞書の派生
    &v1 = {'k' + str(i):i for i in range(10)}

3.パラメータ付きのデコレータ

# 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次。把每次结果添加到列表中返回
 import random
def x(num):
    def wrapper(func):
        def inner(*args,**kwargs):
            results = []
            for i in range(num):
                value = func(*args,**kwargs)
                if value > num:
                    results.append(value)
            return results
        return inner
    return wrapper

@x(5)
def index():
    return random.randint(0,10)

r = index()
print(r)

4.モジュール

4.1 sysモジュール[pythonインタープリターに関連するデータ]

  • \ nラップ
  • \ t集計
  • \ r現在の行の先頭に戻る
##进度条
for i in range(1,101):
    msg = "%s%%\r" %i
    print(msg,end='')
  • 脱出
    • 文字列の前に文字rを追加すると、\ nなどの文字列コンテンツ内の特殊文字が改行されなくなります。
s = r""D:\code\s21day14\n1.mp4" 
  • sys.argvが一般的に使用されます。[ユーザーがスクリプトを実行するときに渡される
    パラメーターを取得します] &実行されたスクリプトのパラメーターを取得しますリストに格納されます。デフォルトの0番目のパラメーターは、実行されたスクリプトの完全パス名です
print(arg)
path = sys.argv[1]
print("删除",path)
  • sys.exit(0);プログラムを終了する

4.2 shutilモジュール[ディレクトリ/ファイルを削除]

import shutil
# 删除目录
ret = shutil.rmtree("")
# 重命名
shutil.move("原文件名","新文件名")
#压缩文件
shutil.make_archive("压缩后的文件名称","压缩成什么格式","需要压缩的目录")
#解压文件
shutil.unpack_archive("需要解压的文件名",extract_dir="解压到哪个目录",format="解压格式")

4.3 osモジュール[オペレーティングシステムに関連するデータ]

  • os.path.exists(path)#パスが存在する場合はTrueを返します
  • os.path.abspath()#ファイルの絶対パスを取得
  • os.path.dirname(file)#ファイルの上位ディレクトリを取得
  • os.path.join(path、file)#スプライシングパス
  • os.stas(ファイル).st_size#ファイルのサイズを取得
  • os.listdir(path)#ディレクトリ内のすべてのファイルをリストします(サブディレクトリを除く、第1レベル)
  • os.walk()#ディレクトリ(含む)サブディレクトリ内のすべてのファイルを一覧表示します[再帰的に]
#查看一个目录下所有的文件
import os
listdir = os.listdir("D:\wuhailuo\python_projects\code\python_jichu\模块作业")
# print(listdir)

# 查询显示指定目录下的所有文件,包括子目录下的所有文件
list_file = os.walk("D:\wuhailuo\python_projects\code\python_jichu\模块作业") #得到一个生成器对象,只有当对其循环是给出结果

for a,b,c in list_file: # a:正在查看的目录,b:此目录下的文件夹,c:此目录下的文件
    for filename in c:
        print(os.path.join(a,filename))

15レッスン/ 16レッスン:モジュールの知識

補足知識

  • 範囲関数:python2 / 3違い:
    • python2:
      • 範囲(10):シーケンス値をメモリにすぐに作成します
      • xrang(10):ループ時にのみ、メモリ内にすぐには作成されません
    • python3:
      • 範囲(10)= p2のxrang(10)

1.モジュールの基礎知識

1.1カスタムモジュール

1.1.1モジュールの定義

  • 定義モジュールは、pyファイルまたはフォルダー(パッケージ)をモジュールと見なすことができるため、後で他のpyファイルを簡単に呼び出すことができます。
  • パッケージの定義について:[python2 / 3の違い]
py2: 文件夹中必须有 __init__.py
py3:不需要 __init__.py 【推荐写代码时,加上此文件】

1.1.2モジュール呼び出し

  • インポートモジュールmodule。function()
  • フォームモジュールインポート関数関数()
  • エイリアスエイリアスとしてフォームモジュールのインポート関数()

まとめ

  • モジュールと実行するファイルが同じディレクトリにあり、モジュール内の多くの機能が必要な場合は、インポートを使用してモジュールをインポートすることをお勧めします
  • その他の推奨事項:モジュールインポートモジュールmoduleから。
  • その他の推奨事項:モジュールから。モジュールのインポート機能()

1.1.3補足

  • インポート

    • インポートモジュール1モジュール1.関数()
    • インポートモジュール1.モジュール2.モジュール3モジュール1.モジュール2.モジュール3.関数()
    • 特別:init .py はインポートフォルダー内にロードされます
  • xxxからインポートxxx

    • 特別:from src import xxx [__init__.py that internal load the src folder]
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 导入模块,加载此模块中所有的值到内存
import os
# 导入模块中某个函数功能
from lizhongwei import func,show
from lizhongwei import * #导入这个模块的所有功能
from lizhongwei import func as f # 避免函数重复覆盖,取别名

1.2組み込みモジュール

1.2.1 OSモジュールのインポートOS

  • os.mkdir( "")は、スクリプトが現在実行されているディレクトリにディレクトリを作成します(1レベルのみ生成できます)
  • os.makedirs(r "dd \ xx \ aa")は、ディレクトリを再帰的に作成します
  • os.rename( "")名前変更

1.2.2 sysモジュールimport sys

  • sys.pathデフォルトでは、Pythonがモジュールをインポートすると、この値のパスに従って検索されます。Pythonファイルが実行されると、現在のファイルのパスがsys.pathに読み込まれます
import sys
### 给Python添加查找模块的路径
sys.path.append('D:\\ ')    

1.2.3 jsonモジュール[一般的に使用される]

  • jsonは特別な文字列です。[長い画像リスト、文字列、辞書、数字]
    • jsonに含まれる文字列は二重引用符で囲む必要があります
  • json文字列の最も外側のレイヤーはコンテナーである必要があります[リスト/辞書]
    • タプルはリストにシリアル化され、コレクションはシリアル化できません
  • json形式のデータのシリアライズ/デシリアライズ
    • シリアライゼーション:Python値をjson形式の文字列に変換しますjson.dumps()
    • 逆シリアル化:json形式の文字列をPythonデータ型json.loads()に変換します
    • 辞書またはリストに中国語が含まれています。シリアル化によって中国語の表示が維持されます[ensure_ascii = False]
# 保留中文显示
val = json.dumps(v,ensure_ascii=False)
v = [12,3,4,{'k1':'v1'},True,'asdf']
import json
# 序列化,将python的值转换为json格式的字符串
v1 = json.dumps(v)
s = '["alex",123]'
#反序列化,将json格式的字符串转换为python的数据类型
s1 = json.loads(s)
  • jsonはpythonデータ型をサポートします
    +-------------------+---------------+
    | Python            | JSON          |
    +===================+===============+
    | dict              | object        |
    +-------------------+---------------+
    | list, tuple       | array         |
    +-------------------+---------------+
    | str               | string        |
    +-------------------+---------------+
    | int, float        | number        |
    +-------------------+---------------+
    | True              | true          |
    +-------------------+---------------+
    | False             | false         |
    +-------------------+---------------+
    | None              | null          |
    +-------------------+---------------+

1.2.4 pickleモジュール[jsonモジュールに類似]

  • jsonの長所:すべての言語に共通、短所:基本的なデータ型(文字列、リスト、辞書、数値)のみをシリアル化できます
  • ピクルの利点:Pythonのすべてを彼(ソケットオブジェクト)でシリアル化できる、欠点:シリアル化の内容はPythonでのみ認識できる。
  • pickle.dumps(v)シリアル化された直接印刷はバイナリコンテンツであり、pickle.loads(val)処理によって通常表示できます。【下記サンプルコード】
  • バイト型ピクルは、シリアライズ後のb'xxxx 'などのバイト型です[以下のサンプルコード]
v = {1,2,3,4,"abc"}
val = pickle.dumps(v) 
print(val)   # b'\x80\x03cbuiltins\nset\nq\x00]q\x01(K\x01K\x02K\x03K\x04X\x03\x00\x00\x00abcq\x02e\x85q\x03Rq\x04.'
******************************
file_obj = open("x.txt",mode='wb')
data = "abc".encode("utf-8")
print(data,type(data))   # b'abc' <class 'bytes'>
file_obj.write(data)
file_obj.close()

1.2.5時刻と日時の時間モジュール

  • UTC / GMT:世界時間
  • 現地時間:現地時間帯の時間
  • タイムモジュール【タイムスタンプ取得】
    • time.time():タイムスタンプ:1970-1-1 00:00 [ランダムな値を使用できます]
    • time.sleep(10)スリープ時間/待機秒
    • time.timezoneタイムゾーン
  • 日時モジュール
from datetime import datetime,timezone,timedelta
vl = datetime.now() #当前本地时间
v2 = datetime.utcnow() # 当前UTC时间
tz = timezone(timedelta(hours=7)) # 当前东7区时间
v3 = datetime.now(tz)
  • 日時時刻形式変換
from datetime import datetime,timezone,timedelta
v1 = datetime.now()
# datetime时间格式转换字符串
v1.strftime('%Y-%m-%d %H-%M-%S')
#
v2 = datetime.strptime('2020-03-22','%Y-%m-%d')
  • 日時とタイムスタンプの関係
ctime =time.time()
v1 = datetime.fromtimestamp(ctime) # 时间戳转datetime
v2 = datetime.now()
v2.timestamp() #datetime转时间戳

1.3サードパーティのモジュール[ダウンロード/インストール/使用]

1.3.1 pipパッケージ管理ツールをインストールするための前提条件、pipを介してサードパーティモジュールをインストールする

  • 最初にpipをインストールしてから、pipを介して必要なサードパーティモジュールをダウンロードしてインストールする必要がありますhttps://pypi.org
    • デフォルトはpythonインストールディレクトリ\ Lib \ site-packagesにあります
# pip.exe所在目录添加到环境变量中
pip install 需要安装的模块名称
  • 一般的に使用されるサードパーティモジュール[リクエスト、xlrd]

1.3.2ソースコードからサードパーティのモジュールをインストールする

  • ソースファイルのダウンロード:圧縮ファイル
  • ファイルを解凍し、このディレクトリをコマンドで入力します
  • python3 setup.py(モジュールインストールファイル名)ビルドを実行[コンパイルチェック]
  • python3 setup.py(モジュールインストールファイル名)を実行しますinstall [install]

1.4カスタムモジュール

1.4.1手順

  • xxx.pyファイルを作成する
def func1():
    pass
def func2():
    pass
  • カスタムモジュールをインポートして関数を呼び出す
import xxx
xxx.func1()
xxx.func2()

2.例外処理

  • 基本的な文法
try:
    程序处理
except exception as e:
    print("异常处理")
  • tryに含まれるコードはエラーを報告し、直接例外をキャッチします。tryブロックのコードは実行を継続しません。したがって、ループをループ内にラップしてみてください。実行結果は異なります。

17レッスン/ 18レッスン

1.イテレーター

  • イテレータ:イテラブルオブジェクトの要素を1つずつ取得し、__ next__メソッドがあります。
  • Iterableオブジェクト:forループで使用するか、内部に__iter__メソッドを含めてイテレータを返すことができます。
# 列表转换成迭代器的两种方式:
v = [1,2,3,4]
#方式一
v1 = iter(v)
#方式二
v2 = v.__iter__()
# 迭代器逐一获取元素,反复调用__next__()方法
val = v1.__next__()

2.ジェネレーター

2.1ジェネレーター

  • ジェネレーター:
    &関数内yieldキーワードはジェネレーター関数です
    &関数が呼び出されてもジェネレーター関数は呼び出されません。呼び出し元の関数はジェネレーターを返します。ジェネレーターがループの場合のみ、ジェネレーター関数内のコードが実行されます、
    各forループは、yieldによって返される値を取得します
def func():
    yield 1
    print("f1")
    yield 2
    print("f2")
    yield 3
    print("f3")
v = func()
# item只拿函数中yield的值
for item in v:
    print(item)
#输出结果:
# 1
# f1
# 2
# f2
# 3
# f3

  • 反復可能オブジェクト:forループとそのようなオブジェクトはすべてiterメソッドを持ち、反復子を返します(ジェネレーターにすることもできます)。
  • ジェネレーター:forループにすることができ、__ iter__メソッドがありますが、__ next__()メソッドもあるため、ジェネレーターは特別なイテレーターまたは特別な反復可能なオブジェクトと呼ぶこともできます
  • div(関数オブジェクト)を介して、関数オブジェクトが所有するメソッドを表示できます
  • ジェネレーターの古典的な例、[データをバッチで読み取るためのredisのシミュレーション]
#通过生成器读取大数据文件 	[模拟redis数据读取]
import time
"""生成所需数据
with open("data.txt",mode='a+',encoding='utf-8') as fileobject:
    for i in range(1,100):
        fileobject.write("你领取到的号牌是:"+str(i)+"\n")
"""
"""生成器函数"""
"""分批去读取文件中的内容,将文件的内容返回给调用者"""
def func():
    index=0
    while True:
        time.sleep(2)
        with open("data.txt",mode='r',encoding='utf-8') as fileobject: #连接上redis
           li = []
           fileobject.seek(index)
           for i in  range(10):
                line = fileobject.readline().strip()
                if not  line:
                    break
                li.append(line)
           index=fileobject.tell()
        # fileobject.close()
        for i in li:
            yield i

v=func()
for l in v:
    print(l)

2.2ジェネレータの導出

  • リスト内包表記とジェネレータ内包表記の違い
#列表推导式
v1 = [i for i in range(10)]
#生成器推导式
v2 = (i for i in range(10))
  • リスト内包表記はすぐに実行され、forループで0〜9のリストを返します。
  • ジェネレータの派生によって返されるv2はジェネレータです。内部forループはすぐには実行されません。v2を呼び出してループを実行するforループがある場合のみ、内部forループが実行され、0〜9個の要素が返されます
v1 = [lambda : i for i in range(10)] # 列表推导式
v1 = (lambda : i for i in range(10))  # 生成器推导式
# 两者区别
# 列表推导式
def func():
    result = []
    for i in range(10):
        def f():
            return i        
        result.append(f)
    return result
v = func()
for item in v:
    print(item()) # 9*9
#上面函数与下面推导式相等
v1 = [lambda : i for i in range(10)]
for item in v1:
    print(item())

#########################################
# 生成器推导式,
def func():
    for i in range(10):
        def f():
            return i
    yield f     
v = func()
for item in v:
    print(item()) # 0~9
   
# 上面函数与下面推导式相等
v2 = (lambda : i for i in range(10))
for item in v2:
    print(item)

2.3からの収量

  • yield fromの後の値は、ジェネレータを返す必要があります。たとえば、以下のtest()関数の戻り値は返すことができません]
  • 詳細についてはコードを参照してください
def test():
    yield 1
    yield 2
    yield 3

def func():
    yield "alex"
    yield "enki"
    yield from test()
v = func()
for item in v:
    print(item)
# 执行结果
"alex"
"enki"
1
2
3

3.以前の知識の補足

py2 / py3とサプリメントの違い

  • str文字列型とエンコーディング関連
    • py3では、str文字列型[一般にメモリ内のデータ操作に使用され、ストレージエンコーディングはユニコードです]
    • py3では、バイトタイプ[一般にネットワーク転送とデータストレージに使用されます。特定のエンコーディングは、pyファイルのファイルヘッダーエンコーディングタイプによって決まります]
    • py2のUnicode型--->はpy3のstr型です
    • py2のstr型---->はpy3のバイト型です
  • 辞書の戻り値の違い
    • アイテム
      • py2が返すリスト
      • py3イテレータ[インデックスでは値を取得できません]
      • py2が返すリスト
      • py3イテレータ[インデックスでは値を取得できません]
    • キー
      • py2が返すリスト
      • py3イテレータ[インデックスでは値を取得できません]
    • マップ/フィルターについても同様です

追加知識

  • インポートモジュール
    • インポートモジュール
    • from module。module import module
    • from module。module。module import module
    • 相対インポート[モジュールには親ディレクトリが必要です。この操作はルートディレクトリでは実行できません]
      • インポートモジュールから
      • インポートモジュールから
    • 注:ファイルとフォルダーの名前は、インポートされたモジュールの名前と同じにすることはできません。そうでなければ、現在のディレクトリで直接検索されます。
  • メインファイル[メイン関数](pyファイルを実行)
    • 属性で区別します。属性__name__の値__main__はメインファイルを意味します
#判断是否为主文件,如果是主文件则执行
if __name__ == '__main__':
    run() #执行入口

おすすめ

転載: www.cnblogs.com/enki-1900/p/12684030.html
おすすめ