匿名関数で、2つの組み込み関数、クロージャ

無名関数

匿名関数名、ラムダのないその関数は、またワード機能として知られています。

需要は今あります:この関数は、2つのint型のパラメータ、および戻り値を受け取り、関数を記述します。

def func(a,b):
    return a+b
print(func(3,4))

無名関数と上記の要件の完成:

func = lambda a,b: a+b
print(func(3, 4))  # 7

上記のコードの分析:

構文:

  関数名は、ラムダパラメータを=:戻り値

1)この関数には名前ではないではありません、彼は名前を持ち、彼の名前はラムダと呼ばれています

2)ラムダキーワードは同等DEF関数である匿名関数を定義します。

3)コンマで区切られたライン限り、形状が参加することができ、どのように多くのラムダパラメータの後ろに直接添加します。

func = lambda a,b,*args,sex= 'alex',c,**kwargs: kwargs
print(func(3, 4,c=666,name='alex'))  # {'name': 'alex'}
# 所有类型的形参都可以加,但是一般使用匿名函数只是加位置参数,其他的用不到。

4)コロンの後の戻り値、戻り値と正常な機能は、任意のデータ型であってもよいです。(ただし、コンテナの形で返される複数の要素を返すようにしたいです)

単一の行を書く。そして、論理データの終了後に直接返すことができますどのように複雑に関係なく5)匿名関数

そして、小さな問題少数の無名関数:

匿名関数を記述:データ・スライスを受信し、0と2(タプルの形式)に対応する要素のインデックスを返します。

func = lambda x:(x[0],x[2])
print(func('afafasd'))

匿名関数を書く:intは2つのパラメータを受け取り、データが返さ大きくなります。

func = lambda x,y: x if x > y else y
print(func(3,100))

組み込み関数Ⅱ

プリント()画面出力。

''' 源码分析
def print(self, *args, sep=' ', end='\n', file=None): # known special case of print
    """
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
    file:  默认是输出到屏幕,如果设置为文件句柄,输出到文件
    sep:   打印多个值之间的分隔符,默认为空格
    end:   每一次打印的结尾,默认为换行符
    flush: 立即把内容输出到流文件,不作缓存
    """
'''

print(111,222,333,sep='*')  # 111*222*333

print(111,end='')
print(222)  #两行的结果 111222

f = open('log','w',encoding='utf-8')
print('写入文件',fle=f,flush=True)

リストは()リストのiterableに変換されます

反復可能タプルにタプル()に変換します

辞書に対応する方法を作成するためのdict()。

list
l1 = list('abcd')
print(l1)  # ['a', 'b', 'c', 'd']
tu1 = tuple('abcd')
print(tu1)  # ('a', 'b', 'c', 'd')

ABS()は絶対値を返します

i = -5
print(abs(i))  # 5

合計()の合計

print(sum([1,2,3]))
print(sum((1,2,3),100))

最小分間()

print(min([1,2,3]))  # 返回此序列最小值

ret = min([1,2,-5,],key=abs)  # 按照绝对值的大小,返回此序列最小值
print(ret)
# 加key是可以加函数名,min自动会获取传入函数中的参数的每个元素,然后通过你设定的返回值比较大小,返回最小的传入的那个参数。
print(min(1,2,-5,6,-3,key=lambda x:abs(x)))  # 可以设置很多参数比较大小
dic = {'a':3,'b':2,'c':1}
print(min(dic,key=lambda x:dic[x]))

# x为dic的key,lambda的返回值(即dic的值进行比较)返回最小的值对应的键

MAX()は、同じ最大値と最小値を使用します。

逆()フリップフリップイテレータリターンのシーケンスであろう例示的なシーケンスを逆:

l = reversed('你好')  # l 获取到的是一个生成器
print(list(l))
ret = reversed([1, 4, 3, 7, 9])
print(list(ret))  # [9, 7, 3, 4, 1]

バイト()バイト型に文字列

s = '你好'
bs = s.encode('utf-8')
print(bs)
结果:b'\xe4\xbd\xa0\xe5\xa5\xbd\xe6\xad\xa6\xe5\xa4\xa7'

s1 = bs.decode('utf-8')
print(s1)
结果: 你好


s = '你好'
bs = bytes(s,encoding='utf-8')
print(bs)
# 将字符串转换成字节

bs1 = str(bs,encoding='utf-8')
print(bs1)
# 将字节转换成字符串

スライドファスナーのZIP()メソッド。パラメータとしてオブジェクトの反復関数は、オブジェクトの対応する要素は、タプルにパックします

矛盾各イテレータの要素の数ならば、最短復帰の長さに応じて、これらのタプル組成物の内容を返します

lst1 = [1,2,3]

lst2 = ['a','b','c','d']

lst3 = (11,12,13,14,15)

for i in zip(lst1,lst2,lst3):

    print(i)

结果:

(1, 'a', 11)

(2, 'b', 12)

(3, 'c', 13)

ソートソート機能

语法:sorted(iterable,key=None,reverse=False)

iterable : 可迭代对象

key: 排序规则(排序函数),在sorted内部会将可迭代对象中的每一个元素传递给这个函数的参数.根据函数运算的结果进行排序

reverse :是否是倒序,True 倒序 False 正序

lst = [1,3,2,5,4]
lst2 = sorted(lst)
print(lst)    #原列表不会改变
print(lst2)   #返回的新列表是经过排序的


lst3 = sorted(lst,reverse=True)
print(lst3)   #倒叙

结果:
[1, 3, 2, 5, 4]
[1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]

字典使用sorted排序

dic = {1:'a',3:'c',2:'b'}
print(sorted(dic))   # 字典排序返回的就是排序后的key

结果:
[1,2,3]

和函数组合使用

# 定义一个列表,然后根据一元素的长度排序
lst = ['天龙八部','西游记','红楼梦','三国演义']

# 计算字符串的长度
def func(s):
    return len(s)
print(sorted(lst,key=func))

# 结果:
# ['西游记', '红楼梦', '天龙八部', '三国演义']


和lambda组合使用

lst = ['天龙八部','西游记','红楼梦','三国演义']

print(sorted(lst,key=lambda s:len(s)))

结果:
['西游记', '红楼梦', '天龙八部', '三国演义']


lst = [{'id':1,'name':'alex','age':18},
    {'id':2,'name':'wusir','age':17},
    {'id':3,'name':'taibai','age':16},]

# 按照年龄对学生信息进行排序

print(sorted(lst,key=lambda e:e['age']))

结果:
[{'id': 3, 'name': 'taibai', 'age': 16}, {'id': 2, 'name': 'wusir', 'age': 17}, {'id': 1, 'name': 'alex', 'age': 18}]

フィルタフィルタフィルタ

语法: filter(function,iterable)

function: 用来筛选的函数,在filter中会自动的把iterable中的元素传递给function,然后根据function返回的True或者False来判断是否保留此项数据

iterable:可迭代对象

lst = [{'id':1,'name':'alex','age':18},
        {'id':1,'name':'wusir','age':17},
        {'id':1,'name':'taibai','age':16},]

ls = filter(lambda e:e['age'] > 16,lst)

print(list(ls))

结果:
[{'id': 1, 'name': 'alex', 'age': 18},
 {'id': 1, 'name': 'wusir', 'age': 17}]

地図で確認

映射函数

语法: map(function,iterable) 可以对可迭代对象中的每一个元素进映射,分别取执行function

计算列表中每个元素的平方,返回新列表

lst = [1,2,3,4,5]

def func(s):

    return  s*s

mp = map(func,lst)

print(mp)

print(list(mp))


改写成lambda

lst = [1,2,3,4,5]

print(list(map(lambda s:s*s,lst)))


计算两个列表中相同位置的数据的和

lst1 = [1, 2, 3, 4, 5]

lst2 = [2, 4, 6, 8, 10]

print(list(map(lambda x, y: x+y, lst1, lst2)))

结果:

[3, 6, 9, 12, 15]

IMG減らします

from functools import reduce
def func(x,y):
    return x + y

# reduce 的使用方式:
# reduce(函数名,可迭代对象)  # 这两个参数必须都要有,缺一个不行

ret = reduce(func,[3,4,5,6,7])
print(ret)  # 结果 25
reduce的作用是先把列表中的前俩个元素取出计算出一个值然后临时保存着,
接下来用这个临时保存的值和列表中第三个元素进行计算,求出一个新的值将最开始
临时保存的值覆盖掉,然后在用这个新的临时值和列表中第四个元素计算.依次类推

注意:放进去的可迭代对象没有更改
以上这个例子使用sum就可以完全的实现了.现在有[1,2,3,4]想让列表中的数变成1234,就要用到reduce了.
普通函数版
from functools import reduce

def func(x,y):

    return x * 10 + y
    # 第一次的时候 x是1 y是2  x乘以10就是10,然后加上y也就是2最终结果是12然后临时存储起来了
    # 第二次的时候x是临时存储的值12 x乘以10就是 120 然后加上y也就是3最终结果是123临时存储起来了
    # 第三次的时候x是临时存储的值123 x乘以10就是 1230 然后加上y也就是4最终结果是1234然后返回了

l = reduce(func,[1,2,3,4])
print(l)

クロージャ

たとえば、次のように歴史を通して商品の平均終値。それのドロー終​​値は何ですか?平均価格は、これまでのすべてのまで検討する:毎日、日中のレコードの価格を起動し、彼の平均値を計算するように見えるそれは、この商品からでした。

小さな白い車:たとえば、フォルクスワーゲンは新しい車を導入しました。

初日価格10万元、平均終値:10万元

次の日価格:110 000元、平均終値:(100000 + 110000)/ 2元

日価格:120 000元、平均終値:(10万+11万+12万)/ 3元

........

series = []
def make_averager(new_value):
    series.append(new_value)
    total = sum(series)
    return total / len(series)

print(make_averager(100000))
print(make_averager(110000))
print(make_averager(120000))

上記の例からわかるように、基本的な要件を完了したが、あなたのリストは、このシリーズはグローバル変数であるため、このコードは限りどこでもグローバルスコープで、比較的安全で、このリストにある可能性があります変更。

series = []
def make_averager(new_value):
    series.append(new_value)
    total = sum(series)
    return total / len(series)

print(make_averager(100000))
print(make_averager(110000))
series.append(666)  # 如果对数据进行相应改变,那么你的平均收盘价就会出现很大的问题。
print(make_averager(120000))

それでは、どのようにそれを行うには?一部の人々は言う、あなたは彼がライン上で機能していないされて入れ、これはまだローカルであることを意味しませんか?データはまだ比較的安全ではないでしょうか?

def make_averager(new_value):
    series = []
    series.append(new_value)
    total = sum(series)
    return total / len(series)


print(make_averager(100000))  # 100000.0
print(make_averager(110000))  # 110000.0
print(make_averager(120000))  # 120000.0

このような計算の結果が、それは関数が実行されているので、それは一時的な名前空間は、関数の最後に消え開きますされ、正しくないので、あなたが機能を実行するたびに、このリストを再作成することで、これはどのようにありますそれを行いますか?この場合、私たちはどのようなこのコードを変更するには、アイデアの閉鎖で、クロージャを使用する必要があります。

def make_averager():

    series = []
    def averager(new_value):
        series.append(new_value)
        total = sum(series)
        return total/len(series)

    return averager

avg = make_averager()
print(avg(100000))
print(avg(110000))
print(avg(120000))

ネストされた関数内の関数。だから、平均受信この変数は3回平均3つの平均化は、この機能を実行する実行され、対応するメモリアドレス、あるアベレージ実際の関数名、です。

クロージャパッケージ定義:

  1. 関数は、クロージャー関数内でネストされています。
  2. クロージャは、内部関数(非グローバル変数)参照の外層の変数関数でなければなりません。

裁判官の閉鎖を決定する方法は?

# 例一:
def wrapper():
    a = 1
    def inner():
        print(a)
    return inner
ret = wrapper()

# 例二:
a = 2
def wrapper():
    def inner():
        print(a)
    return inner
ret = wrapper()


# 例三:

def wrapper(a,b):
    def inner():
        print(a)
        print(b)
    return inner
a = 2
b = 3
ret = wrapper(a,b)

上記の3つの例は、私はそれはいくつかの非科学的、またはあまりにも多くの問題があり、閉鎖でないかどうかを判断するために、コードに入るたびに、第3および閉鎖、三番目に、裁判官に困難実際には、その後、いくつかの機能がありますこのプロパティを取得することができ、この機能は自由変数を持っている場合、それはクロージャの関数であるかどうか(という側面することができ、それは自由変数を持っているかどうかの関数である知っています):

def make_averager():

    series = []
    def averager(new_value):
        series.append(new_value)
        total = sum(series)
        return total/len(series)

    return averager
avg = make_averager()
# 函数名.__code__.co_freevars 查看函数的自由变量
print(avg.__code__.co_freevars)  # ('series',)
当然还有一些参数,仅供了解:

# 函数名.__code__.co_freevars 查看函数的自由变量
print(avg.__code__.co_freevars)  # ('series',)
# 函数名.__code__.co_varnames 查看函数的局部变量
print(avg.__code__.co_varnames)  # ('new_value', 'total')
# 函数名.__closure__ 获取具体的自由变量对象,也就是cell对象。
# (<cell at 0x0000020070CB7618: int object at 0x000000005CA08090>,)
# cell_contents 自由变量具体的值
print(avg.__closure__[0].cell_contents)  # []

アクション閉鎖:ローカル情報を保存し、データのセキュリティを確保するために、破壊されません。

アプリケーションパッケージの閉鎖

  1. あなたは、非グローバル変数の一部を保存することができますが、容易に破壊することができない、データを変更しました。
  2. デコレーター。

おすすめ

転載: www.cnblogs.com/sundawei7/p/11228835.html