徹底的にPythonの機能を知ってもらう2

まず、変数のスコープ

変数の変数と呼ばれる関数のコード領域の範囲は、異なるスコープ内の変数名は、互いに独立して、同一であってもよいです。

  • ローカル変数関数内で共通の変数は、関数内でのみ作業を定義しました。ローカル変数は自動的に削除機能の実行が終了した後、使用できなくなります。
    リファレンスは、優先度が使用に与えられるべきで、より高速なグローバル変数、ローカル変数を超えています。

  • グローバル変数は、キーワードグローバルで定義することができます。これは、二つの状況に分かれています:
    関数内でこの変数の割り当てのために必要であれば、関数の外で定義された1 Aの変数を、そしてあなたは、関数の外への割り当ての結果を反映したい、関数内でグローバル使用してグローバル変数として宣言することができます。
    2.変数が定義されていない場合は、関数の実行は、新しいグローバル変数を追加します後、関数の外では、直接、グローバル変数の変数関数の内部で定義してもよいです。

  • このような動作は、変数、その後、行うことができる場合、関数内の変数の基準値に過ぎず、それに新しい値を割り当てる(暗黙)グローバル変数

  • 変数の操作位置の任意の関数で有望な新しい価値場合は、変数があると思われる(暗黙の)ローカル変数を明示的グローバル関数内のキーワードで宣言しない限り、。

>>> def demo():
    global x                 #x被声明为全局变量
    x = 3
    y = 4
    print(x,y)

>>> x = 5
>>> demo()
3  4
>>> x
3               #如果把global x删去则输出5,因为此时上边定义的x为局部变量,只在demo()函数内生效
>>> y           #因为y是局部变量所以在函数外调用会报错
NameError: name 'y' is not defined
>>> del x         #把x删掉
>>> x
NameError: name 'x' is not defined
>>> demo()
3  4
>>> x
3
>>> y
NameError: name 'y' is not defined
  • 同じ名前のローカル変数とグローバル変数の場合、ローカル変数がします外部の機能に影響を与えない、その範囲内の同じ名前のグローバル変数を隠すが、ローカル変数は、関数内で宣言しました
>>> def demo():
    x = 3         #创建了局部变量,并自动隐藏了同名的全局变量	

>>> x = 5
>>> x
5                #函数内部声明的局部变量不会影响函数外部
>>> demo()
>>> x             #函数执行不影响外面全局变量的值
5

二、ラムダ式

  • ラムダ式は、匿名関数を宣言するために使用することができ、関数名は、機会の関数として別の関数パラメータのニーズに特に適した小型の一時的な使用の関数ではありません。また、名前の関数を定義することができます。
  • ラムダ式は、単一の表現を含むことができる式の計算結果が関数の戻り値として見ることができる、化合物のステートメントは許可されず、式中の他の関数を呼び出すことができます。
>>> f = lambda x, y, z: x+y+z        #可以给lambda表达式起名字
>>> f(1,2,3)                         #像函数一样调用
6
>>> g = lambda x, y=2, z=3: x+y+z    #参数默认值
>>> g(1)
6
>>> g(2, z=4, y=5)                   #关键参数
11
>>> L = [1,2,3,4,5]
>>> print(list(map(lambda x: x+10, L)))        #模拟向量运算
[11, 12, 13, 14, 15]
>>> L
[1, 2, 3, 4, 5]
>>> data = list(range(20))           #创建列表
>>> data
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> import random
>>> random.shuffle(data)             #打乱顺序
>>> data
[4, 3, 11, 13, 12, 15, 9, 2, 10, 6, 19, 18, 14, 8, 0, 7, 5, 17, 1, 16]
>>> data.sort(key=lambda x: x)       #和不指定规则效果一样
>>> data
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> data.sort(key=lambda x: len(str(x)))     #按转换成字符串以后的长度排序
>>> data
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> data.sort(key=lambda x: len(str(x)), reverse=True)     #降序排序,两位数在前
>>> data
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

第三に、発電機能

  • 含まれていyield文の関数はジェネレータオブジェクトを作成するために使用することができ、この機能とも呼ばれる発電機能
  • yield文とreturn文の効果と同様の値が関数から返すために使用されています。違いは、return文、ということであるreturn文は、値の文を生じ、一時停止またはコードの実装の後ろにハングアップするために、すぐに、しかし、各実行の復帰後機能動作の終了後に実行されます(__ __nextにより、次のオブジェクト生成、要素またはそうでなければ、明示的な「要求」データをループするときに、オブジェクトレジュームを生成するための組み込み関数の次の())方法、。
  • 発生器は有する遅延評価の大型データ処理に適した特性を、。
#编写并使用能够生成斐波那契数列的生成器函数。
>>> def f():
    a, b = 1, 1            #序列解包,同时为多个元素赋值
    while True:
        yield a            #暂停执行,需要时再产生一个新元素
        a, b = b, a+b      #序列解包,继续生成新元素

>>> a = f()                #创建生成器对象
>>> for i in range(10):    #斐波那契数列中前10个元素
    print(a.__next__(), end=' ')
1 1 2 3 5 8 13 21 34 55 

>>> for i in f():         #斐波那契数列中第一个大于100的元素
    if i > 100:
        print(i, end=' ')
        break

144
>>> a = f()               #创建生成器对象
>>> next(a)               #使用内置函数next()获取生成器对象中的元素
1
>>> next(a)               #每次索取新元素时,由yield语句生成
1
>>> a.__next__()          #也可以调用生成器对象的__next__()方法
2
>>> a.__next__()
3
公開された108元の記事 ウォンの賞賛332 ・は 30000 +を見て

おすすめ

転載: blog.csdn.net/zag666/article/details/105073301