【Python大神秘籍Top10】這些竅門99%的人都不知道

2021-02-20 新智元



  新智元報導 

來源:GitHub

作者:Rafe Kettler

編譯:三石

【新智元導讀】Python神奇方法是指一些允許在自定義類中增加「神奇」功能的方法。而在Python官方文檔中,有關這些方法的介紹或描述不僅內容分散,而且組織結構也相對鬆散。本文便對Python神奇方法做了系統的梳理。對於初學者亦或Python行家,都或多或少的會有些幫助。

話不多說,直接進入主題!

Python神奇指南目錄

簡介

搭建與初始化

在自定義類中運用操作符

      神奇方法比較

      神奇方法數字

描述自定義類

控制屬性訪問

製作自定義序列

反射

可調用對象

上下文管理器

構建描述符對象

何為神奇方法呢?它們是面向Python中的一切,是一些特殊的方法允許在自己的定義類中定義增加「神奇」的功能。它們總是使用雙下劃線(比如__init__或__lt__),但它們的文檔沒有很好地把它們表現出來。所有這些神奇方法都出現在Python的官方文檔中,但內容相對分散,組織結構也顯得鬆散。還有你會難以發現一個實例(雖然他們被設計很棒,在語言參考中被詳細描述,可之後就會伴隨著枯燥的語法描述等)。

為了彌補Python官方文檔的這些缺陷,作者整理了這篇有關magic method的文章,旨在用作教程、複習或參考文檔。

相信大家都熟悉這個最基礎的神奇方法__init__。它令你能自定義一個對象的初始化行為。而當我調用x=SomeClass()時,__init__並不是最先被調用的。實際上有一個叫做__new__的方法,事實上是它創建了實例,它傳遞任何參數給初始化程序來達到創建的目的。在對象生命周期結束時,調用__del__。讓我們更近地觀察下這3個神奇方法吧:

一個對象的實例化時__new__是第一個被調用的方法。在類中傳遞其他任何參數到__init__。__new__很少被使用,這樣做確實有其目的,特別是當一個子類繼承一個不可改變的類型(一個元組或一個字符串)時。

類的初始化。創建對象後,python解釋器默認調用__init__()方法。無論主構造函數調用什麼,它都會被傳遞。__init__幾乎在Python類定義中普遍使用。

如果__new__和__init__構成了對象的構造函數,__ del__就是析構函數。當刪除一個對象時,python解釋器也會默認調用__del__()方法。在python中,對於開發者來說很少會直接銷毀對象(如果需要,應該使用del關鍵字銷毀)。Python的內存管理機制能夠很好的勝任這份工作。也就是說,不管是手動調用del還是由python自動回收都會觸發__del__方法執行。

如下,是是__init__和__del__的例子:

from os.path import join
class FileObject:
    '''對文件對象的包裝,確保文件在關閉時得到刪除'''

    def __init__(self, filepath='~', filename='sample.txt'):
        
        self.file=open(join(filepath,filename), 'r+')

    def __del__(self):
        self.file.close()
        del self.file


神奇方法比較:

Python有一大堆magic method,旨在使用運算符實現對象之間的直觀比較,而非彆扭的方法調用。它們還提供了一種方法來覆蓋用於對象比較的默認Python行為。下面是這些方法的列表以及它們的作用:

__cmp__是神奇方法中最基礎的一個。實際上它實現所有比較操作符行為(<,==,!=,等),但它有可能不按你想要的方法工作(例如,一個實例是否等於另一個這取決於比較的準則,以及一個實例是否大於其他的這也取決於其他的準則)。如果self < other,那__cmp__應當返回一個負整數;如果self == other,則返回0;如果self > other,則返回正整數。它通常是最好的定義,而不需要你一次就全定義好它們,但當你需要用類似的準則進行所有的比較時,__cmp__會是一個很好的方式,幫你節省重複性和提高明確度。

定義了相等操作符,==的行為。

定義了不相等操作符,!=的行為。

定義了小於操作符,<的行為。

定義了大於操作符,>的行為。

定義了小於等於操作符,<=的行為。

定義了大於等於操作符,>=的行為。

舉一個例子,設想對單詞進行類定義。我們可能希望按照內部對字符串的默認比較行為,即字典序(通過字母)來比較單詞,也希望能夠基於某些其他的準則,像是長度或音節數。在本例中,我們通過單詞長度排序,以下給出實現:

class Word(str):
   '''單詞類,比較定義是基於單詞長度的'''

    def __new__(cls, word):
        
        
        if ' ' in word:
            print "單詞內含有空格,截斷到第一部分"
            word = word[:word.index(' ')] 
        return str.__new__(cls, word)

    def __gt__(self, other):
        return len(self) > len(other)
    def __lt__(self, other):
        return len(self) < len(other)
    def __ge__(self, other):
        return len(self) >= len(other)
    def __le__(self, other):
        return len(self) <= len(other)

神奇方法數字:

就像你可以通過重載比較操作符的途徑來創建你自己的類實例,你同樣可以重載數字操作符。


一元操作符:

一元運算和函數僅有一個操作數,比如負數,絕對值等。

實現一元正數的行為(如:+some_object)

實現負數的行為(如: -some_object)

實現內建abs()函數的行為

實現用~操作符進行的取反行為。

常規算數操作符:

現在我們涵蓋了基本的二元運算符:+,-,*等等。其中大部分都是不言自明的。

實現加法

實現減法

實現乘法

__floordiv__(self, other)

實現地板除法,使用//操作符

實現傳統除法,使用/操作符

實現真正除法。注意,只有當你from __future__ import division時才會有效

實現求模,使用%操作符

實現內建函數divmod()的行為

實現乘方,使用**操作符

實現左按位位移,使用<<操作符

實現右按位位移,使用>>操作符

實現按位與,使用&操作符

實現按位或,使用|操作符

實現按位異或,使用^操作符

反射算數操作符:

首先舉個例子:some_object + other。這是「常規的」加法。而反射其實相當於一回事,除了操作數改變了改變下位置:other + some_object。在大多數情況下,反射算術操作的結果等價於常規算術操作,所以你盡可以在剛重載完__radd__就調用__add__。乾脆痛快:

實現反射加法

實現反射減法

實現反射乘法

__rfloordiv__(self, other)

實現反射地板除,用//操作符

實現傳統除法,用/操作符

__rturediv__(self, other)

實現真實除法,注意,只有當你from __future__ import division時才會有效

實現反射求模,用%操作符

實現內置函數divmod()的長除行為,當調用divmod(other,self)時被調用

實現反射乘方,用**操作符

實現反射的左按位位移,使用<<操作符

實現反射的右按位位移,使用>>操作符

實現反射的按位與,使用&操作符

實現反射的按位或,使用|操作符

實現反射的按位異或,使用^操作符

增量賦值:

Python也有各種各樣的神奇方法允許用戶自定義增量賦值行為。

這些方法都不會有返回值,因為賦值在Python中不會有任何返回值。反而它們只是改變類的狀態。列表如下:

實現加法和賦值

實現減法和賦值

實現乘法和賦值

__ifloordiv__(self, other)

實現地板除和賦值,用//=操作符

實現傳統除法和賦值,用/=操作符

__iturediv__(self, other)

實現真實除法和賦值,注意,只有當你from __future__ import division時才會有效

實現求模和賦值,用%=操作符

實現乘方和賦值,用**=操作符

實現左按位位移和賦值,使用<<=操作符

實現右按位位移和賦值,使用>>=操作符

實現按位與和賦值,使用&=操作符

實現按位或和賦值,使用|=操作符

實現按位異或和賦值,使用^=操作符

類型轉換的神奇方法:

Python也有一組神奇方法被設計用來實現內置類型轉換函數的行為,如float()。

實現到int的類型轉換

實現到long的類型轉換

實現到float的類型轉換

實現到複數的類型轉換

實現到8進位的類型轉換

實現到16進位的類型轉換

實現一個當對象被切片到int的類型轉換。如果你自定義了一個數值類型,考慮到它可能被切片,所以你應該重載__index__。

當math.trunc(self)被調用時調用。__trunc__應當返回一個整型的截斷,(通常是long)。

該方法用來實現混合模式的算術。如果類型轉換不可能那__coerce__應當返回None。否則,它應當返回一對包含self和other(2元組),且調整到具有相同的類型。

用一個字符串來說明一個類這通常是有用的。在Python中提供了一些方法讓你可以在你自己的類中自定義內建函數返回你的類行為的描述。

當你定義的類中一個實例調用了str(),用於給它定義行為

當你定義的類中一個實例調用了repr(),用於給它定義行為。str()和repr()主要的區別在於它的閱讀對象。repr()產生的輸出主要為計算機可讀(在很多情況下,這甚至可能是一些有效的Python代碼),而str()則是為了讓人類可讀。

當你定義的類中一個實例調用了unicode(),用於給它定義行為。unicode()像是str(),只不過它返回一個unicode字符串。警惕!如果用戶用你的類中的一個實例調用了str(),而你僅定義了__unicode__(),那它是不會工作的。以防萬一,你應當總是定義好__str__(),哪怕用戶不會使用unicode。

當你定義的類中一個實例調用了hash(),用於給它定義行為。它必須返回一個整型,而且它的結果是用於來在字典中作為快速鍵比對。

當你定義的類中一個實例調用了bool(),用於給它定義行為。返回True或False,取決於你是否考慮一個實例是True或False的。

我們已經相當漂亮地幹完了神奇方法無聊的部分(無示例),至此我們已經討論了一些基礎的神奇方法,是時候讓我們向高級話題移動了。

Python通過神奇的方法實現了大量的封裝,而不是通過明確的方法或欄位修飾符。例如:

你可以為用戶在試圖訪問不存在(不論是存在或尚未建立)的類屬性時定義其行為。這對捕捉和重定向常見的拼寫錯誤,給出使用屬性警告是有用的(只要你願意,你仍舊可選計算,返回那個屬性)或拋出一個AttributeError異常。這個方法只適用於訪問一個不存在的屬性,所以,這不算一個真正封裝的解決之道。

__setattr__(self, name, value)

不像__getattr__,__setattr__是一個封裝的解決方案。它允許你為一個屬性賦值時候的行為,不論這個屬性是否存在。這意味著你可以給屬性值的任意變化自定義規則。然而,你需要在意的是你要小心使用__setattr__,在稍後的列表中會作為例子給出。

這等價於__setattr__,但是作為刪除類屬性而不是set它們。它需要相同的預防措施,就像__setattr__,防止無限遞歸(當在__delattr__中調用del self.name會引起無限遞歸)。

__getattribute__(self, name)

__getattribute__良好地適合它的同伴們__setattr__和__delattr__。可我卻不建議你使用它。

__getattribute__只能在新式類中使用(在Python的最新版本中,所有的類都是新式類,在稍舊的版本中你可以通過繼承object類來創建一個新式類。它允許你定規則,在任何時候不管一個類屬性的值那時候是否可訪問的。)它會因為他的同伴中的出錯連坐受到某些無限遞歸問題的困擾(這時你可以通過調用基類的__getattribute__方法來防止發生)。當__getattribute__被實現而又只調用了該方法如果__getattribute__被顯式調用或拋出一個AttributeError異常,同時也主要避免了對__getattr__的依賴。這個方法可以使用,不過我不推薦它是因為它有一個小小的用例(雖說比較少見,但我們需要特殊行為以獲取一個值而不是賦值)以及它真的很難做到實現0bug。

你可以很容易地在你自定義任何類屬性訪問方法時引發一個問題。參考這個例子:

def __setattr__(self, name, value):
    self.name = value
    
    
    

def __setattr__(self, name, value):
    self.__dict__[name] = value 
    

以下是一個關於特殊屬性訪問方法的實際例子(注意,我們使用super因為並非所有類都有__dict__類屬性):

class AccessCounter:
    '''一個類包含一個值和實現了一個訪問計數器。
    當值每次發生變化時,計數器+1'''

    def __init__(self, val):
        super(AccessCounter, self).__setattr__('counter',0)
        super(AccessCounter, self).__setattr__('value', val)

    def __setattr__(self, name, value):
        if name == 'value':
            super(AccessCounter, self).__setattr__('counter', self.counter + 1)
        
        
        super(AccessCounter, self).__setattr__(name, value)

    def __delattr__(self, name)
        if name == 'value':
            super(AccessCounter, self).__setattr__('counter', self.counter + 1)
        super(AccessCounter, self).__delattr__(name)

很有多種方式可以讓你的類表現得像內建序列(字典,元組,列表,字符串等)。這些是我迄今為止最喜歡的神奇方法了,因為不合理的控制它們賦予了你一種魔術般地讓你的類實例整個全局函數數組漂亮工作的方式。

返回容器的長度。部分protocol同時支持可變和不可變容器

定義當某一個item被訪問時的行為,使用self[key]表示法。這個同樣也是部分可變和不可變容器protocol。這也可拋出適當的異常:TypeError 當key的類型錯誤,或沒有值對應Key時。

__setitem__(self, key, value)

定義當某一個item被賦值時候的行為,使用self[key]=value表示法。這也是部分可變和不可變容器protocol。再一次重申,你應當在適當之處拋出KeyError和TypeError異常。

定義當某一個item被刪除(例如 del self[key])時的行為。這僅是部分可變容器的protocol。在一個無效key被使用後,你必須拋出一個合適的異常。

應該給容器返回一個迭代器。迭代器會返回若干內容,大多使用內建函數iter()表示。當一個容器使用形如for x in container:的循環。迭代器本身就是其對象,同時也要定義好一個__iter__方法來返回自身。

當定義調用內建函數reversed()時的行為。應該返回一個反向版本的列表。

__contains__為成員關係,用in和not in測試時定義行為。那你會問這個為何不是一個序列的protocol的一部分?這是因為當__contains__未定義,Python就會遍歷序列,如果遇到正在尋找的item就會返回True。

最後,你可通過__concat__定義你的序列和另外一個序列的連接。應該從self和other返回一個新構建的序列。當調用2個序列時__concat__涉及操作符+

在我們的例子中,讓我們看一下一個list實現的某些基礎功能性的構建。可能會讓你想起你使用的其他語言(比如Haskell)。

class FunctionalList:
    '''類覆蓋了一個list的某些額外的功能性魔法,像head,
    tail,init,last,drop,and take'''
    def __init__(self, values=None):
        if values is None:
            self.values = []
        else:
            self.values = values

    def __len__(self):
        return len(self.values)

    def __getitem__(self, key):
        
        return self.values[key]

    def __setitem__(self, key, value):
        self.values[key] = value

    def __delitem__(self, key):
        del self.values[key]

    def __iter__(self):
        return iter(self.values)

    def __reversed__(self):
        return reversed(self.values)

    def append(self, value):
        self.values.append(value)
    def head(self):
        
        return self.values[0]
    def tail(self):
        
        return self.values[1:]
    def init(self):
        
        return self.values[:-1]
    def last(last):
        
        return self.values[-1]
    def drop(self, n):
        
        return self.values[n:]
    def take(self, n):
        
        return self.values[:n]

你也可以通過定義神奇方法來控制如何反射使用內建函數isinstance()和issubclass()的行為。這些神奇方法是:

__instancecheck__(self, instance)

檢查一個實例是否是你定義類中的一個實例(比如,isinstance(instance, class))

__subclasscheck__(self, subclass)

檢查一個類是否是你定義類的子類(比如,issubclass(subclass, class))

這是Python中一個特別的神奇方法,它允許你的類實例像函數。所以你可以「調用」它們,把他們當做參數傳遞給函數等等。這是另一個強大又便利的特性讓Python的編程變得更可愛了。

允許類實例像函數一樣被調用。本質上,這意味著x()等價於x.__call__()。注意,__call__需要的參數數目是可變的,也就是說可以對任何函數按你的喜好定義參數的數目定義__call__。

__call__可能對於那些經常改變狀態的實例來說是極其有用的。「調用」實例是一種順應直覺且優雅的方式來改變對象的狀態。下面一個例子是一個類表示一個實體在一個平面上的位置:

class Entity:
    '''描述實體的類,被調用的時候更新實體的位置'''

    def __init__(self, size, x, y):
        self.x, self.y = x, y
        self.size = size

    def __call__(self, x, y):
        '''改變實體的位置'''
        self.x, self.y = x, y

    

上下文管理允許對對象進行設置和清理動作,用with聲明進行已經封裝的操作。上下文操作的行為取決於2個神奇方法:

定義塊用with聲明創建出來時上下文管理應該在塊開始做什麼。

__exit__(self,  exception_type, exception_value, traceback)

定義在塊執行(或終止)之後上下文管理應該做什麼。

你也可以使用這些方法去創建封裝其他對象通用的上下文管理。看下面的例子:

class Closer:
    '''用with聲明一個上下文管理用一個close方法自動關閉一個對象'''

    def __init__(self, obj):
        self.obj = obj

    def __enter__(self):
        return self.obj 

    def __exit__(self, exception_type, exception_val, trace):
        try:
            self.obj.close()
        except AttributeError: 
            print 'Not closable.'
            return True 

以下是一個對於Closer實際應用的一個例子,使用一個FTP連接進行的演示(一個可關閉的套接字):

>>> from magicmethods import Closer
>>> from ftplib import :;;
>>> with Closer(FTP('ftp.somsite.com')) as conn:
...     conn.dir()
...

>>> conn.dir()

>>> with Closer(int(5)) as i:
...     i += 1
...
Not closeable.
>>> i
6

描述符可以改變其他對象,也可以是訪問類中任一的getting,setting,deleting。

作為一個描述符,一個類必須至少實現__get__,__set__,和__delete__中的一個。讓我們快點看一下這些神奇方法吧:

__get__(self, instance, owner)

當描述符的值被取回時定義其行為。instance是owner對象的一個實例,owner是所有類。

__set__(self, instance, value)

當描述符的值被改變時定義其行為。instance是owner對象的一個實例,value是設置的描述符的值

__delete__(self, instance)

當描述符的值被刪除時定義其行為。instance是owner對象的一個實例。

現在,有一個有用的描述符應用例子:單位轉換策略

class Meter(object):
    '''米描述符'''

    def __init__(self, value=0.0):
        self.value = float(value)
    def __get__(self, instance, owner):
        return self.value
    def __set__(self, instance, value):
        self.value = float(value)

class Foot(object):
    '''英尺描述符'''

    def __get__(self, instance, owner):
        return instance.meter * 3.2808
    def __set__(self, instance, value):
        instance.meter = float(value) / 3.2808

class Distance(object):
    '''表示距離的類,控制2個描述符:feet和meters'''
    meter = Meter()
    foot = Foot()

這份指南的目標就是讓任何人都能讀懂它,不管讀者們是否具備Python或面向對象的編程經驗。如果你正準備學習Python,那你已經獲得了編寫功能豐富、優雅、易用的類的寶貴知識。如果你是一名中級Python程式設計師,你有可能已經拾起了一些概念、策略和一些好的方法來減少你編寫的代碼量。如果你是一名Python專家,你可能已經回顧了某些你可能已經遺忘的知識點,或者你又又有一些新的發現。不管你的經驗等級如何,希望你在這次Python神奇方法之旅中有所收穫!

原文連結:

https://rszalski.github.io/magicmethods/#appendix1


新智元AI WORLD 2018大會【早鳥票】

開售!

新智元將於9月20日在北京國家會議中心舉辦AI WORLD 2018 大會,邀請機器學習教父、CMU教授 Tom Mitchell,邁克思·泰格馬克,周志華,陶大程,陳怡然等AI領袖一起關注機器智能與人類命運。

大會官網:

http://www.aiworld2018.com/ 

即日起到8月19日,新智元限量發售若干早鳥票,與全球AI領袖近距離交流,見證全球人工智慧產業跨越發展。

相關焦點

  • 80%的人都不知道,全球Python庫下載前10名
    但是你知道全球最受歡迎的python庫嘛?今天小編就從PYPI網站的過去365天的python庫下載量上,來看一下全球最火的22個python庫。01.Urllib3Urllib3在過去365天中,下載量達到了9.55億次。
  • 學Python不知道從何入手?來看看這一份Python學習任務清單!
    站在風口上,豬都能飛起來。人工智慧風口,讓Pyhon這門膠水語言轉變成非常火的網紅語言。編程功力深厚的程式設計師花一兩個星期就能上手Python,而一些新手程式設計師花幾個月就可以上手。不過,面對Python網上有紛雜的資料,一些程式設計師卻不知道該怎麼選擇。學習Python沒有章法,那麼編程就無法建立體系,這就導致了一種現象:學了好長的一段時間感覺仍然只學了一個皮毛。
  • 每個python人都離不開的12個python庫
    如果說python能取得今天的成就,一方面是它簡介的語法,更重要的一方面就是它豐富的第三方庫,可以毫不誇張的說,只要你能想到的任何一個功能模塊,都有對應的python庫,可以說正是因為有了豐富的python庫,python才發展得如此迅速,下面我們來看看python人最常用的20個python
  • 八行python代碼展現程式設計師從入門到大神的八種階段
    這八種狀態也是一個程式設計師從入門到大神(跑路)的八個階段,每個階段對應一行代碼並且可以直接運行,看看你現在已經到了哪個階段1.初學pythonprint("Hello World!")99%的程式設計師都是從這一行代碼開始了不歸路。還有那1%是少兒編程的小學生,因為他們從import turtle開始。
  • 單身情人節,看看這位Python小哥如何完成人生的逆襲!
    看看他的履歷就知道了。要知道在7年前的2013年,Kenneth還是這樣。這是當年Kenneth在PyCON演講「Python for Humans」時候的樣子:現實特別殘忍,當時除了程式設計師,其他人對他都不太感冒,也沒有妹子。亂糟糟沒有型的髮型,黑款眼鏡,萬年不變的T恤。
  • python如何快速入門
    昨天有同學私信我,說看了機器學習的東西,但是不懂python,也不知道怎麼入門,打算介紹一下思路給同學參考一下。首先,要連接python是什麼?可以做什麼?目前有什麼場景?機器學習實戰-sklearn介紹接下來,我根據我的經驗,來給出建議,可以參考一下如何入門堅持打卡三個月如果相當一位優秀的開發者,一定要學會堅持每天學習打卡,這是接下來入門的基礎,如果只是學習幾天就想有所建樹,基本上不可能的
  • 這些Python代碼技巧,你肯定還不知道
    請點擊這裡:https://pypi.org/project/emoji/$ pip install emoji別以為我不知道你會偷偷試它→→$ pip install howdoi無論你有什麼問題都可以問它,它會盡力回答。
  • 表白暗語「962464」你知道什麼意思嗎?我打賭99%不知道
    大家好,小編今天要講的是關於男女之間感情的問題,現在網絡那麼發達,聊天軟體也非常多,所以人際關係與交往也都是一件非常簡單的事情,但往往很多人情商太低導致根本沒有女孩子喜歡自己,而今天小編要講的是表白暗語「962464」你知道什麼意思嗎?我打賭99%不知道!
  • 教你怎麼挑草莓,最後一個竅門99%的人都不知道
    沒有草莓的冬天總覺得缺了些什麼,那碩大飽滿、嬌豔欲滴的果實一看就很有食慾,一口咬下去,酸甜的汁水在口腔爆開,好吃的眼睛都要眯起來~雖然超市裡隨處可見草莓的身影,但沒有什麼比親自摘的草莓更甜的了,但我們要去哪裡採摘呢?又有哪些注意事項呢?值得一去的草莓採摘園!
  • 如何自學成 Python 大神?這裡有些建議
    實踐創建自己的項目,或加入開源社區( https://coolpythoncodes.com/julien-danjou )和 Github,這些都是編程的必經之路。對於像 Python 這樣的語言來說更是如此,如今開發者社區正以驚人的速度增長,每天都有新的庫和項目在快速更新。
  • 【每天學點技術應用】Python運行效率慢?因為你不知道這六大竅門!
    不喜歡Python的人經常會吐嘈Python運行太慢。但是,事實並非如此。嘗試以下六個竅門,來為你的Python應用提速。竅門一:關鍵代碼使用外部功能包 Python簡化了許多編程任務,但是對於一些時間敏感的任務,它的表現經常不盡人意。使用C/C++或機器語言的外部功能包處理時間敏感任務,可以有效提高應用的運行效率。
  • 王者榮耀:朕哥70勝率蘭陵王銘文秘籍,大神排行榜就是不一樣!
    遙想當年,朕哥可是蘭陵王蘋果微信21區,大神排行榜第一!當時好像是100把勝率73+左右。當然當年大部分都是五排打上去的,比較穩嘛!勝率自然比較高。不像現在,獨自一人抓爆對面,無奈那啥,就不說了,反正勝率掉了。
  • 廚房裝修丨家用吸油煙機選購秘籍,收好這份秘籍不走彎路!
    秘籍一:看風量在中國家庭的日常烹飪中,我們有著自己別具一格的烹飪手法——爆炒。爆炒出的佳餚固然讓人垂涎三尺,但其產生的油煙問題也會讓主婦們困擾不堪。所以經常爆炒的家庭選擇煙機時,排風量至少要在17m³/min以上。索奇作為中國廚房電器十大品牌,洞悉客戶需求,推出的L310煙機,低位進風口設計,吸力下潛。
  • 很多人都不知道,這4種家常菜,做法看似簡單,卻有很多小竅門
    #爆款創造營#一提起家常菜,很多人的第一印象應該是簡單,包括在家裡做家常菜也一樣,總是怎麼簡單怎麼做,其實越是家常的菜,越值得研究,就比如我今天要給大家分享的這4種家常菜,做法看似簡單,但是裡面卻有很多的小竅門,而這些小竅門不僅可以幫我們縮短菜品的烹飪時間,而且對整個菜的品質也有很大的提升,很多人都不知道這些小竅門,今天我給大家分享一下,希望大家能夠喜歡。
  • 中年大叔的Python自學之路
    2.文章偏未入門初學者新手向,為了讓沒有任何編程基礎的人看懂,儘量不說行話,不用術語。歡迎大神們指出錯誤,冷嘲熱諷的一概無視。1.學編程難麼?為什麼學python不學其他程式語言?先介紹下小編背景,大專生,非計算機專業。無任何計算機編程基礎。
  • 小遊戲跳一跳:3個小技巧,輕鬆跳出96340分,很多人都不知道!
    小程序現在越來越受到大眾的歡迎,幾乎所有的商家都推出了自己的小程序,給廣大的民眾帶來了很多的便利。而小程序中的小遊戲更是吸引了很多人,讓人愛不釋手。很多小夥伴一定知道微信裡的一款火爆小遊戲,沒錯就是跳一跳這款小遊戲,這是一個很簡單的遊戲,但是卻並不是每個玩家都能夠得到高分。會有很多人在尋找得高分的小秘籍。除了簡單的按照遊戲的規則操作,每跳一步得一分以外,如何像其他玩家一樣跳出過萬分的成績呢? 其實得到高分並不是很難,在宣布玩家的真實有效成績來觀察,就已經有玩家成績過萬了。
  • 一顆大蔥,5種藥,但99%的人都吃錯了!不看不知道…
    家居風水小竅門 家居風水,助你聚氣生財,消災避禍! 大蔥是日常生活中常見的食材,同時也是一味具有眾多祛病養生功效的中藥。 俗語有云:一根蔥,十分鐘。
  • Python字符串處理的8招秘籍
    line='*'*30print(line)>>******************************2.字符串的分割(1)普通的分割,用split函數,但是split只能做非常簡單的分割,而且不支持多個分隔。
  • 上上下下左右左右BA,知道這條秘籍的人已經老了
    相信很多80後甚至90後的玩家,都知道《魂鬥羅》裡著名的加命秘籍——上上下下左右左右BA。於是,很多人只知道加命秘籍,而不知道他的發明者是誰。 後來,在談及這條秘籍的時候,橋本和久表示原本打算在完成《宇宙巡航艦》測試後刪除對應代碼。但是由於疏忽大意,這個秘籍被保留了下來。此後,科樂美的多款遊戲中都出現了這條秘籍,包括《忍者神龜3》、《實況足球3》、《合金裝備2》等。