成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識(shí)庫 > Python 中的函數(shù)裝飾器和閉包詳解

Python 中的函數(shù)裝飾器和閉包詳解

熱門標(biāo)簽:鎮(zhèn)江人工外呼系統(tǒng)供應(yīng)商 申請(qǐng)辦個(gè)400電話號(hào)碼 400電話辦理費(fèi)用收費(fèi) 千呼ai電話機(jī)器人免費(fèi) 騰訊地圖標(biāo)注有什么版本 外呼系統(tǒng)前面有錄音播放嗎 高德地圖標(biāo)注字母 柳州正規(guī)電銷機(jī)器人收費(fèi) 深圳網(wǎng)絡(luò)外呼系統(tǒng)代理商

函數(shù)裝飾器可以被用于增強(qiáng)方法的某些行為,如果想自己實(shí)現(xiàn)裝飾器,則必須了解閉包的概念。

裝飾器的基本概念

裝飾器是一個(gè)可調(diào)用對(duì)象,它的參數(shù)是另一個(gè)函數(shù),稱為被裝飾函數(shù)。裝飾器可以修改這個(gè)函數(shù)再將其返回,也可以將其替換為另一個(gè)函數(shù)或者可調(diào)用對(duì)象。

例如:有個(gè)名為 decorate 的裝飾器:

@decorate
def target():
 print('running target()')

上述代碼的寫法和以下寫法的效果是一樣的:

def target():
 print('running target()')
 
target = decorate(target)

但是,它們返回的 target 不一定是原來的那個(gè) target 函數(shù),例如下面這個(gè)例子:

>>> def deco(func):
...  def inner():
...   print('running inner()')
...  return inner
...
>>> @deco
... def target():
...  print('running target()')
...
>>> target()
running inner()
>>> target
function deco.locals>.inner at 0x0000013D88563040>

可以看到,調(diào)用 target 函數(shù)執(zhí)行的是 inner 函數(shù),這里的 target 實(shí)際上是 inner 的引用。

何時(shí)執(zhí)行裝飾器

裝飾器的另一個(gè)關(guān)鍵特性是,它們?cè)诒谎b飾函數(shù)定義時(shí)立即執(zhí)行,這通常是發(fā)生在導(dǎo)入模塊的時(shí)候。

例如下面的這個(gè)模塊:registration.py

# 存儲(chǔ)被裝飾器 @register 裝飾的函數(shù)
registry = []

# 裝飾器
def register(func):
 print(f"注冊(cè)函數(shù) -> {func}")
 # 記錄被裝飾的函數(shù)
 registry.append(func)
 return func

@register
def f1():
 print("執(zhí)行 f1()")

@register
def f2():
 print("執(zhí)行 f2()")

def f3():
 print("執(zhí)行 f3()")

if __name__ == "__main__":
 print("執(zhí)行主函數(shù)")
 print("registry -> ", registry)
 f1()
 f2()
 f3()

現(xiàn)在我們?cè)诿钚袌?zhí)行這個(gè)腳本:

$ python registration.py
注冊(cè)函數(shù) -> function f1 at 0x000001F6FC8320D0>
注冊(cè)函數(shù) -> function f2 at 0x000001F6FC832160>
執(zhí)行主函數(shù)
registry -> [function f1 at 0x000001F6FC8320D0>, function f2 at 0x000001F6FC832160>]
執(zhí)行 f1()
執(zhí)行 f2()
執(zhí)行 f3()

這里我們可以看到,在主函數(shù)執(zhí)行之前,register 已經(jīng)執(zhí)行了兩次。加載模塊后,registry 中已經(jīng)有兩個(gè)被裝飾函數(shù)的引用:f1f2。不過這兩個(gè)函數(shù)以及 f3 都是在腳本中明確調(diào)用后才開始執(zhí)行的。

如果只是單純的導(dǎo)入 registration.py 模塊而不運(yùn)行:

>>> import registration
注冊(cè)函數(shù) -> function f1 at 0x0000022670012280>
注冊(cè)函數(shù) -> function f2 at 0x0000022670012310>

查看 registry 中的值:

>>> registration.registry
[function f1 at 0x0000022670012280>, function f2 at 0x0000022670012310>]

這個(gè)例子主要說明:裝飾器在導(dǎo)入模塊時(shí)立即執(zhí)行,而被裝飾的函數(shù)只有在明確調(diào)用時(shí)才運(yùn)行。這也突出了 Python 中導(dǎo)入時(shí)和運(yùn)行時(shí)這個(gè)兩個(gè)概念的區(qū)別。

在裝飾器的實(shí)際使用中,有兩點(diǎn)和示例是不同的:

  • 示例中裝飾器和被裝飾函數(shù)在同一個(gè)模塊中。實(shí)際使用中,裝飾器通常在一個(gè)單獨(dú)的模塊中定義,然后再應(yīng)用到其它模塊的函數(shù)上。
  • 示例中 register 裝飾器返回的函數(shù)和傳入的參數(shù)相同。實(shí)際使用中,裝飾器會(huì)在內(nèi)部定義一個(gè)新函數(shù),然后將其返回。

裝飾器內(nèi)部定義并返回新函數(shù)的做法需要靠閉包才能正常運(yùn)作。為了理解閉包,則必須先了解 Python 中的變量作用域。

變量作用域的規(guī)則

我們來看下面這個(gè)例子,一個(gè)函數(shù)讀取一個(gè)局部變量 a,一個(gè)全局變量 b。

>>> def f1(a):
...  print(a)
...  print(b)
...
>>> f1(3)
3
Traceback (most recent call last):
 File "stdin>", line 1, in module>
 File "stdin>", line 3, in f1
NameError: name 'b' is not defined

出現(xiàn)錯(cuò)誤并不奇怪。如果我們先給 b 賦值,再調(diào)用 f1,那就不會(huì)出錯(cuò)了:

>>> b = 1
>>> f1(3)
3
1

現(xiàn)在,我們來看一個(gè)不尋常的例子:

>>> b = 1
>>> def f2(a):
...  print(a)
...  print(b)
...  b = 2
...
>>> f2(3)
3
Traceback (most recent call last):
 File "stdin>", line 1, in module>
 File "stdin>", line 3, in f2
UnboundLocalError: local variable 'b' referenced before assignment

這里,f2 函數(shù)的前兩行和 f1 相同,然后再給 b 賦值??墒牵谫x值之前,第二個(gè) print 失敗了。這是因?yàn)镻ython 在編譯函數(shù)的定義體時(shí),發(fā)現(xiàn)在函數(shù)中有給 b 賦值的語句,因此判斷它是局部變量。而在上述示例中,當(dāng)我們打印局部變量 b 時(shí),它并沒有被綁定值,故而報(bào)錯(cuò)。

Python 不要求聲明變量,但是會(huì)把在函數(shù)定義體中賦值的變量當(dāng)成局部變量。

如果想把上述示例中的 b 看成全局變量,則需要使用 global 聲明:

>>> b = 1
>>> def f3(a):
...  global b
...  print(a)
...  print(b)
...  b = 2
...
>>> f3(3)
3
1
>>> b
2
>>> f3(3)
3
2

閉包

閉包是指延伸了作用域的函數(shù),其中包含了函數(shù)定義體中的引用,以及不在定義體中定義的非全局變量。

我們通過以下示例來理解這句話。

假設(shè)我們有這種需求,計(jì)算某個(gè)商品在整個(gè)歷史中的平均收盤價(jià)格(商品每天的價(jià)格會(huì)變化)。例如:

>>> avg(10)
10.0
>>> avg(11)
10.5
>>> avg(12)
11.0

那么如何獲取 avg 函數(shù)?歷史收盤價(jià)格又是如何保存的?

我們可以用一個(gè)類來實(shí)現(xiàn):

class Averager:
 def __init__(self):
  self.serial = []

 def __call__(self, price):
  self.serial.append(price)
  return sum(self.serial) / len(self.serial)

Averager 的實(shí)例是一個(gè)可調(diào)用對(duì)象。

>>> avg = Averager()
>>> avg(10)
10.0
>>> avg(11)
10.5
>>> avg(12)
11.0

也可以使用一個(gè)函數(shù)來實(shí)現(xiàn):

>>> def make_averager():
...  serial = []
...  def averager(price):
...   serial.append(price)
...   return sum(serial) / len(serial)
...  return averager
...
>>> avg = make_averager()
>>> avg(10)
10.0
>>> avg(11)
10.5
>>> avg(12)
11.0

第一種寫法很明顯的可以看到,所有歷史收盤價(jià)均保存在實(shí)例變量 self.serial 中。

第二種寫法我們要好好的分析一下:serialmake_averager 的局部變量,但是當(dāng)我們調(diào)用 avg(10) 時(shí),make_averager 函數(shù)已經(jīng)返回了,它的作用域不是應(yīng)該消失了嗎?

實(shí)際上,在 averager 函數(shù)中,serial 是自由變量(未在本地作用域中綁定的變量)。如下圖所示:

我們可以在 averager 返回對(duì)象的 __code__ 屬性中查看它的局部變量和自由變量的名字。

>>> avg.__code__.co_varnames
('price',)
>>> avg.__code__.co_freevars
('serial',)

自由變量 serial 綁定的值存放在 avg 對(duì)象的 __closure__ 屬性中,它是一個(gè)元組,里面的元素是 cell 對(duì)象,它的 cell_contents 屬性保存實(shí)際的值:

>>> avg.__closure__
(cell at 0x000002266FF99430: list object at 0x00000226702841C0>,)
>>> avg.__closure__[0].cell_contents
[10, 11, 12]

綜上所述,閉包是一種函數(shù),它會(huì)保留定義函數(shù)時(shí)存在的自由變量的綁定值,這樣在我們調(diào)用這個(gè)函數(shù)時(shí),即使作用域不在了,仍然可以使用這些綁定的值。

注意:

只有嵌套在其它函數(shù)中的函數(shù)才可能需要處理不在全局作用域中的外部變量。

nonlocal 聲明

前面的 make_averager 方法的效率并不高,我們可以只保存當(dāng)前的總值和元素個(gè)數(shù),再使用它們計(jì)算平均值。下面是我們更改后的函數(shù)體:

>>> def make_averager():
...  count = total = 0
...  def averager(price):
...   count += 1
...   total += price
...   return total / count
...  return averager

但是這個(gè)寫法實(shí)際上是有問題的,我們先運(yùn)行再分析:

>>> avg = make_averager()
>>> avg(10)
Traceback (most recent call last):
 File "stdin>", line 1, in module>
 File "stdin>", line 4, in averager
UnboundLocalError: local variable 'count' referenced before assignment

這里 count 被當(dāng)成 averager 的局部變量,而不是我們期望的自由變量。這是因?yàn)?count += 1 相當(dāng)于 count = count + 1。因此,我們?cè)?averager 函數(shù)體中實(shí)際包含了給 count 賦值的操作,這就把 count 變成局部變量。total 也有這個(gè)問題。

為了解決這個(gè)問題,Python3 引入了 nonlocal 關(guān)鍵字,用于聲明自由變量。使用 nonlocal 修改上述的例子:

>>> def make_averager():
...  count = total = 0
...  def averager(price):
...   nonlocal count, total
...   count += 1
...   total += price
...   return total / count
...  return averager
...
>>> avg = make_averager()
>>> avg(10)
10.0
>>> avg(11)
10.5
>>> avg(12)
11.0

疊放裝飾器

如果我們把 @d1@d2 兩個(gè)裝飾器應(yīng)用到同一個(gè)函數(shù) f() 上,實(shí)際相當(dāng)于 f = d1(d2(f))。

也就是說,下屬代碼:

@d1
@d2
def f():
	pass

等同于:

def f():
	pass
f = d1(d2(f))

參數(shù)化裝飾器

Python 會(huì)把被裝飾的參數(shù)作為第一個(gè)參數(shù)傳遞給裝飾器函數(shù),那么如何讓裝飾器接受其它的參數(shù)呢?這里我們需要定義一個(gè)裝飾器工廠函數(shù),返回真正的裝飾器函數(shù)。

以本文開頭的 register 裝飾器為例,我們?yōu)樗砑右粋€(gè) active 參數(shù),如果置為 False,那就不注冊(cè)這個(gè)函數(shù)。

registry = []

def register(active=True):
 def decorate(func):
  if active:
   print(f"注冊(cè)函數(shù) -> {func}")
   # 記錄被裝飾的函數(shù)
   registry.append(func)
  return func

 return decorate

@register()
def f1():
 print("執(zhí)行 f1")

@register(active=False)
def f2():
 print("執(zhí)行 f2")

現(xiàn)在我們導(dǎo)入這個(gè)模塊:

>>> import registration
注冊(cè)函數(shù) -> function f1 at 0x0000016D80402280>

可以看到只注冊(cè)了 f1 函數(shù)。

實(shí)現(xiàn)一個(gè)簡(jiǎn)單的裝飾器

這里我們使用嵌套函數(shù)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的裝飾器:計(jì)算被裝飾函數(shù)執(zhí)行的耗時(shí),并將函數(shù)名、參數(shù)和執(zhí)行的結(jié)果打印出來。

import time
def clock(func):
 def clocked(*args):
  start_time = time.perf_counter()
  result = func(*args)
  cost = time.perf_counter() - start_time
  print(
   "[%.2f] %s(%s) -> %r" % (cost, func.__name__, list(map(repr, args)), result)
  )
  return result

 return clocked

下面我們來試試這個(gè)裝飾器:

>>> @clock
... def factorial(n):
...  # 計(jì)算 n 的階乘
...  return 1 if n  2 else n * factorial(n - 1)
>>> 
>>> factorial(6)
[0.00] factorial(['1']) -> 1
[0.00] factorial(['2']) -> 2
[0.00] factorial(['3']) -> 6
[0.00] factorial(['4']) -> 24
[0.00] factorial(['5']) -> 120
[0.00] factorial(['6']) -> 720
720

具體來分析一下,這里 factorial 作為 func 參數(shù)傳遞給 clock 函數(shù),然后 clock 函數(shù)返回 clocked 函數(shù),Python 解釋器會(huì)把 clocked 賦值給 factorial。所以,如果我們查看 factorial__name__ 屬性,會(huì)發(fā)現(xiàn)它的值是 clocked 而不是 factorial。

>>> factorial.__name__
'clocked'

所以,factorial 保存的是 clocked 的引用,每次調(diào)用 factorial 實(shí)際上都是在調(diào)用 clocked 函數(shù)。

我們也可以使用 functools.wraps 裝飾器把 func 的一些屬性復(fù)制到 clocked 函數(shù)上,例如:__name____doc__

def clock(func):
 @functools.wraps(func)
 def clocked(*args):
  start_time = time.perf_counter()
  result = func(*args)
  cost = time.perf_counter() - start_time
  print(
   "[%.2f] %s(%s) -> %r" % (cost, func.__name__, list(map(repr, args)), result)
  )
  return result

 return clocked
>>> 
>>> @clock
... def factorial(n):
...  return 1 if n  2 else n * factorial(n - 1)
>>> 
>>> factorial.__name__
'factorial'

標(biāo)準(zhǔn)庫中的裝飾器

使用 functools.lru_cache 做備忘

functools.lru_cache 會(huì)把耗時(shí)的函數(shù)的結(jié)果保存起來,避免傳入相同的參數(shù)時(shí)的重復(fù)計(jì)算。lru 的意思是 Least Recently Used,表示緩存不會(huì)無限增長(zhǎng),一段時(shí)間不用的緩存條目會(huì)被丟棄。

lru_cache 非常適合計(jì)算第 n 個(gè)斐波那契數(shù)這樣的慢速遞歸函數(shù)。

我們來看看不使用 lru_cache 時(shí)的情況:

>>> @clock
... def fibonacci(n):
...  return n if n  2 else fibonacci(n - 2) + fibonacci(n - 1)
...
>>> fibonacci(6)
[0.00000040] fibonacci(['0']) -> 0
[0.00000060] fibonacci(['1']) -> 1
[0.00030500] fibonacci(['2']) -> 1
[0.00000030] fibonacci(['1']) -> 1
[0.00000040] fibonacci(['0']) -> 0
[0.00000060] fibonacci(['1']) -> 1
[0.00042110] fibonacci(['2']) -> 1
[0.00074440] fibonacci(['3']) -> 2
[0.00128530] fibonacci(['4']) -> 3
[0.00000020] fibonacci(['1']) -> 1
[0.00000030] fibonacci(['0']) -> 0
[0.00000050] fibonacci(['1']) -> 1
[0.00035500] fibonacci(['2']) -> 1
[0.00055270] fibonacci(['3']) -> 2
[0.00000030] fibonacci(['0']) -> 0
[0.00000060] fibonacci(['1']) -> 1
[0.00041220] fibonacci(['2']) -> 1
[0.00000040] fibonacci(['1']) -> 1
[0.00000040] fibonacci(['0']) -> 0
[0.00000050] fibonacci(['1']) -> 1
[0.00032410] fibonacci(['2']) -> 1
[0.00061420] fibonacci(['3']) -> 2
[0.00122760] fibonacci(['4']) -> 3
[0.00206850] fibonacci(['5']) -> 5
[0.00352630] fibonacci(['6']) -> 8
8

這種方式有很多重復(fù)的計(jì)算,例如 fibonacci(['1']) 執(zhí)行了 8 次,fibonacci(['2']) 執(zhí)行了 5 次等等。

現(xiàn)在我們使用 functools.lru_cache 優(yōu)化一下:

>>> @functools.lru_cache
... @clock
... def fibonacci(n):
...  return n if n  2 else fibonacci(n - 2) + fibonacci(n - 1)
...
>>> fibonacci(6)
[0.00000060] fibonacci(['0']) -> 0
[0.00000070] fibonacci(['1']) -> 1
[0.00106320] fibonacci(['2']) -> 1
[0.00000080] fibonacci(['3']) -> 2
[0.00132790] fibonacci(['4']) -> 3
[0.00000060] fibonacci(['5']) -> 5
[0.00159670] fibonacci(['6']) -> 8
8

可以看到節(jié)省了一般的執(zhí)行時(shí)間,并且 n 的每個(gè)值只調(diào)用了一次函數(shù)。

在執(zhí)行 fibonacci(30) 時(shí),如果使用未優(yōu)化的版本需要 141 秒,使用優(yōu)化后的版本只需要 0.002 秒。

除了優(yōu)化遞歸算法之外,lru_cache 在從 WEB 獲取信息的應(yīng)用中也能發(fā)揮巨大作用。

lru_cache 還有兩個(gè)可選參數(shù):

def lru_cache(maxsize=128, typed=False):
  • maxsize:最多可存儲(chǔ)的調(diào)用結(jié)果的個(gè)數(shù)。緩存滿了之后,舊的結(jié)果被丟棄。為了獲取最佳的性能,maxsize 應(yīng)該設(shè)置為 2 的冪。
  • typed:如果置為 True,會(huì)把不同參數(shù)類型得到的結(jié)果分開保存。例如:f(3.0)f(3) 會(huì)被當(dāng)成不同的調(diào)用。

單分派泛函數(shù)

假設(shè)我們現(xiàn)在開發(fā)一個(gè)調(diào)試 WEB 應(yīng)用的工具:生成 HTML,顯示不同類型的 Python 對(duì)象。

我們可以這樣編寫一個(gè)函數(shù):

import html
def htmlize(obj):
 content = html.escape(repr(obj))
 return f"pre>{content}/pre>"

現(xiàn)在我們需要做一些拓展,讓它使用特別的方式顯示某些特定類型:

  • str:把字符串內(nèi)部的 \n 替換為 br>\n,并且使用 p> 替換 pre>;
  • int:以十進(jìn)制和十六進(jìn)制顯示數(shù)字;
  • list:顯示一個(gè) HTML 列表,根據(jù)各個(gè)元素的類型格式化;

最常用的方式就是寫 if...elif..else 判斷:

import numbers
from collections.abc import MutableSequence

def htmlize(obj):
 if isinstance(obj, str):
  content = obj.replace("\n", "br>\n")
  return f"p>{content}/p>"
 elif isinstance(obj, numbers.Integral):
  content = f"{obj} ({hex(obj)})"
  return f"pre>{content}/pre>"
 elif isinstance(obj, MutableSequence):
  content = "/li>\nli>".join(htmlize(item) for item in obj)
  return "ul>\nli>" + content + "/li>\n/ul>"
 else:
  content = f"pre>{obj}/pre>"
  return content

如果想添加新的類型判斷,只會(huì)將函數(shù)越寫越長(zhǎng),并且各個(gè)類型之間耦合度較高,不利于維護(hù)。

Python 3.4 新增的 functools.singledispatch 裝飾器可以將整個(gè)方案拆分成多個(gè)模塊。

import numbers
from collections.abc import MutableSequence
from functools import singledispatch

@singledispatch
def htmlize(obj):
 content = f"pre>{obj}/pre>"
 return content

@htmlize.register(str)
def _(text):
 content = text.replace("\n", "br>\n")
 return f"p>{content}/p>"
@htmlize.register(numbers.Integral)
def _(num):
 content = f"{num} ({hex(num)})"
 return f"pre>{content}/pre>"

@htmlize.register(MutableSequence)
def _(seq):
 content = "/li>\nli>".join(htmlize(item) for item in seq)
 return "ul>\nli>" + content + "/li>\n/ul>"

這里我們?yōu)槊恳粋€(gè)需要特殊處理的類型都定義另一個(gè)專門的函數(shù)。

functools.singledispatch 的更詳細(xì)的文檔參考:https://www.python.org/dev/peps/pep-0443/。

到此這篇關(guān)于Python 中的函數(shù)裝飾器和閉包詳解的文章就介紹到這了,更多相關(guān)Python函數(shù)裝飾器和閉包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • python閉包和裝飾器你了解嗎
  • Python 中閉包與裝飾器案例詳解
  • Python必備基礎(chǔ)之閉包和裝飾器知識(shí)總結(jié)
  • python高級(jí)語法之閉包和裝飾器詳解
  • python閉包的實(shí)例詳解

標(biāo)簽:合肥 平頂山 郴州 哈爾濱 烏蘭察布 海南 烏蘭察布 大慶

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Python 中的函數(shù)裝飾器和閉包詳解》,本文關(guān)鍵詞  Python,中的,函數(shù),裝飾,器,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Python 中的函數(shù)裝飾器和閉包詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于Python 中的函數(shù)裝飾器和閉包詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    91在线观看网站| 开心九九激情九九欧美日韩精美视频电影| 亚洲欧美一区二区激情| 先锋音影av资源中文网| 成人美女视频在线观看| 羞羞答答一区二区| 天海翼中文字幕| 人妻一区二区三区四区| 久久国产精品一区二区三区| jizz18欧美| 国产精品—色呦呦| 精品国产乱码久久久久久蜜臀网站| 国产三级一区二区三区| 国产精品一区二区三区99| 色婷婷粉嫩av| 免费观看成年人视频在线观看| 一级中文字幕一区二区| 亚洲国产乱码最新视频| 久久久91精品国产一区二区三区| 日韩免费视频一区二区视频在线观看| 国产一区二区网址| www.xxxx日本| 国产激情一区二区三区在线观看| 日韩av一卡二卡| 欧美视频在线免费播放| av在线你懂的| 亚洲精品视频免费观看| 久久韩国免费视频| 蜜桃久久av| 日韩欧美精品综合| 国产日韩欧美日韩| 亚洲热av色在线播放| 亚洲午夜18毛片在线看| 中文字幕中文字幕在线一区| 日本伊人精品一区二区三区介绍| 亚洲综合激情在线| 黄色动漫在线免费观看| 日韩极品少妇| japanese色国产在线看视频| 国产欧美精品aaaaaa片| 亚洲AV成人无码一二三区在线| 偷拍中文亚洲欧美动漫| 日韩电影在线看| 欧美一区二视频在线免费观看| 丝瓜av网站精品一区二区| 国产日韩一区二区三区| 日韩美女主播在线视频一区二区三区| 亚洲色图欧美在线| 西西午夜视频| 欧美大片高清| 国产情侣久久久久aⅴ免费| 狠狠色狠狠色综合日日小说| 亚洲国产天堂久久国产91| 午夜剧场免费看| 欧美久久综合| 免费三级毛片| 亚洲欧美久久234| 青青在线观看视频中文字| 成人一区二区三区仙踪林| 米奇精品一区二区三区| www.国产在线观看| 久久综合久久综合久久综合| 成人全视频高清免费观看| 95精品视频在线| 成人在线影视| 在线免费观看你懂的| aa一级黄色片| 国产精品美女| 精品视频一区二区三区| 少妇大叫太粗太大爽一区二区| 亚洲午夜精品久久久久久久久| 美女黄毛**国产精品啪啪| 男女午夜激情视频| 在线电影中文字幕| 久久久久久一区二区三区四区别墅| 欧美人善zozσ性伦交| 亚洲人免费短视频| 久久裸体视频| 久久影院在线观看| 久久精品人人| 91免费国产精品| av男人天堂一区| 久草免费在线观看| 欧美美女直播网站| 风间由美性色一区二区三区四区| 色琪琪丁香婷婷综合久久| 欧美专区国产专区| 九九热精品视频在线观看| 欧美一区二区视频在线观看2022| 免费在线观看你懂的| 91丝袜一区二区三区| 欧美第一黄网| 成人中心免费视频| 免费在线成人av电影| 国产三级精品三级在线观看国产| 亚洲乱码一区二区三区三上悠亚| 99热这里只有成人精品国产| 国产福利在线播放| 成人网男人的天堂| 变态黄色小视频网站| 四虎5151久久欧美毛片| 中文字幕第8页| 精品不卡在线| 亚洲成av人片一区二区| 欧美风情在线视频| 国产精品久久久久毛片大屁完整版| 缴情综合网五月天| 美女诱惑一区二区| 国产成人久久精品77777| 思思久久精品视频| 五月天激情开心网| 午夜欧美一区二区三区免费观看| 欧洲生活片亚洲生活在线观看| 欧洲亚洲免费在线| 北条麻妃一区二区三区中文字幕| 成人欧美精品一区二区| 国产日韩欧美精品在线| 久久久久久欧美精品se一二三四| 成人久久网站| 免费能直接在线观看黄的视频| 国产精品久久久久久久免费软件| 91国语精品自产拍在线观看性色| 国产中文精品久高清在线不| 黄色片免费看| 手机av免费在线观看| 日本在线中文字幕一区| 在线免费观看麻豆| 亚洲精品免费在线看| 日韩不卡在线观看日韩不卡视频| 伊人色**天天综合婷婷| 神马电影网我不卡| 国产精品视频看看| 97xxxxx| 深夜视频在线免费| 亚洲国产精品嫩草影院久久av| 69亚洲精品久久久蜜桃小说| 国产伦精品一区二区三区四区视频| 91精品综合久久久久久五月天| 亚洲欧洲在线观看| 在线亚洲欧美专区二区| 男人女人黄一级| 日韩精品成人一区| 美女与牲口做爰视频在线观看| 日韩欧美亚洲范冰冰与中字| 卡一卡二国产精品| 国产日本一区二区三区| 97精品在线观看| 国产女主播一区二区| 日本一区影院| 女同久久另类69精品国产| 色婷婷一区二区三区在线观看| 亚洲调教欧美在线| 视频一区欧美日韩| 日韩三级在线观看| 国产欧美日韩最新| 正在播放久久| 影音先锋欧美在线| 日本在线播放一二三区| 91香蕉视频在线观看视频| 亚洲黄色小视频在线观看| 极品美乳网红视频免费在线观看| 国产一级在线视频| 国产丝袜护土调教在线视频| 免费观看黄色网| 国产亚洲成av人片在线观看| 免费国产阿v视频在线观看| 美女流白浆视频| 欧美 日韩 国产精品| 欧美精彩视频一区二区三区| 成人国产精品日本在线| 蜜臀va亚洲va欧美va天堂| 萌白酱国产一区二区| 夜鲁夜鲁夜鲁视频在线播放| 天天操夜夜骑| 国产精品久久久久免费a∨| 强乱中文字幕av一区乱码| 黄色大片免费观看| 亚洲日穴在线视频| 2023av在线| 国产又粗又猛又爽又黄的视频一| 一本久久综合亚洲鲁鲁五月天| 三级影片在线观看欧美日韩一区二区| 麻豆精品永久免费视频| 久久精品久久综合| 欧美第一黄色网| 不卡伊人av在线播放| 性色av蜜臀av浪潮av老女人| 国产性70yerg老太| 亚洲成人av一区二区三区| 欧美电影精品一区二区| 在线免费观看羞羞视频一区二区| 黑人与娇小精品av专区| 国产午夜福利一区| 日本不卡一区二区三区高清视频| 久久不射影院| 国产高清不卡| 天天做天天摸天天爽天天爱| 欧美极品一区二区| 亚洲免费激情视频| 九九在线精品视频| 久久久精品国产一区二区| 亚洲一区二区av电影| 免费h精品视频在线播放| 色中色777| 91久久国产自产拍夜夜嗨| 欧美人伦禁忌dvd放荡欲情| 91偷拍精品一区二区三区| 色涩成人影视在线播放| 日韩成人精品在线观看| 日韩欧美在线123| 日韩精品免费一区二区三区| 91久久极品少妇xxxxⅹ软件| 香艳视频网站| 国精产品一区一区二区三区mba| 精品久久久久久久久久岛国gif| 在线电影一区二区| 欧美独立站高清久久| 国产欧美日韩精品在线观看| 女人抽搐喷水高潮国产精品| 另类图片第一页| 4438x成人网最大色成网站| 国产精品区在线观看| 亚洲欧美日韩久久久久久| 欧美性受xxxx黑人猛交| 国产精品迅雷| 欧美精品momsxxx| 一区二区不卡久久精品| 亚洲视频在线不卡| 久久国产精品视频在线观看| 亚洲网站在线免费观看| 公侵犯人妻一区二区三区| 丁香网亚洲国际| 成人在线视频免费观看| 最近中文av字幕在线中文| 国产精品乡下勾搭老头1| 国产欧美在线观看免费| 图片区 小说区 区 亚洲五月| 精品国产免费一区二区三区香蕉| 日韩精品免费一区二区三区竹菊| y111111国产精品久久久| 久久久久久免费看| 青青草成人免费视频| a级在线免费观看| 灌醉mj刚成年的大学平面模特| 日本中文字幕成人| 无码国精品一区二区免费蜜桃| 黄毛片在线观看| 三上悠亚作品在线观看| 蜜桃视频在线网站| 成人在线视频亚洲| 日韩欧美视频一区二区三区| 亚洲成人影院在线观看| 99久久亚洲一区二区三区青草| 日本学生初尝黑人巨免费视频| av网站中文字幕| 成人国产激情| 青青草原成人在线视频| 久草手机在线视频| 欧美一级做一级爱a做片性| 91在线播放国产| 亚洲人成伊人成综合网小说| 日本aⅴ在线观看| 中文字幕久热精品在线视频| 色婷婷激情久久| 亚洲欧美自拍偷拍色图| 韩国一区二区视频| 麻豆传媒在线看| 殴美一级特黄aaaaaa| 中文字幕乱伦视频| 成人毛片免费| 樱花草在线观看www| 国产精品自拍区| 四虎影视最新网站入口在线观看| av在线不卡网站| 精品成人久久| 亚洲精品免费在线播放| 国产美女在线一区二区三区| 欧美一级黄色录像片| 日韩三级成人| 欧美三级蜜桃2在线观看| 亚洲欧美日韩中文播放| 亚洲国产综合在线观看| 人妻中文字幕一区二区三区| 亚洲一区二区福利视频| 日韩午夜小视频| 蜜桃免费在线视频| 欧美男女爱爱视频| 污污视频网站免费观看| 男男gay免费网站| 欧美精品一区在线观看| 午夜精品免费在线观看| 18岁成人毛片| 色婷婷av国产精品| 日b视频在线观看| 99久久综合| 伊人久久大香线蕉av不卡| 日本一区二区三区在线播放| 欧美日韩一级二级三级| 国产粉嫩一区二区三区在线观看| 日韩毛片免费观看| 日本中文字幕观看| 欧美一级欧美一级| 日日噜噜噜夜夜爽亚洲精品| 日本aⅴ大伊香蕉精品视频| 日韩av自拍偷拍| 992tv在线观看在线播放| 日韩欧美在线网站| 中文字幕在线看片| 午夜精品亚洲一区二区三区嫩草| 精品亚洲视频在线| 国产欧美精品久久久| 2024短剧网剧在线观看| 国产精品∨欧美精品v日韩精品| 日本三区在线观看| 牛牛热在线视频| 在线观看91精品国产入口| 无码人妻精品一区二区三区99v| 黑人巨大亚洲一区二区久| 亚洲国产精品一区二区三区| 久久久精品久久久久久96| www.18av.com| 亚洲成a人片在线不卡一二三区| 黄漫在线播放| 亚洲国产成人精品一区二区三区| 国产美女无遮挡永久免费| 毛片无码国产| 亚洲第一页av| 屁屁影院在线观看|