真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python中的頂層函數(shù) c++頂層函數(shù)

python最頂層基類是什么

object是最頂層基類。object是type的實(shí)例,而type又繼承object。頂層基類的特性:

公司主營業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出烏魯木齊免費(fèi)做網(wǎng)站回饋大家。

1、可以賦值一個(gè)變量。

2、可以添加到集合對象中。

3、可以作為參數(shù)傳遞給函數(shù)。

4、可以當(dāng)作函數(shù)的返回值。

Python pandas數(shù)據(jù)計(jì)數(shù)函數(shù)value_counts

value_counts是一種查看表格某列中有多少個(gè)不同值的快捷方法,并計(jì)算每個(gè)不同值有在該列中個(gè)數(shù),類似Excel里面的count函數(shù)

其是pandas下面的頂層函數(shù),也可以作用在Series、DataFrame下

常規(guī)用法:

pandas 的 value_counts() 函數(shù)可以對Series里面的每個(gè)值進(jìn)行計(jì)數(shù) 并且 排序,默認(rèn)是降序

可以看出,既可以對分類變量統(tǒng)計(jì),也可以對連續(xù)數(shù)值變量統(tǒng)計(jì)

如果是要對結(jié)果升序排列,可以添加 ascending=True 來改變

如果不想看統(tǒng)計(jì)的個(gè)數(shù),而是想看占比,那么可以設(shè)置 normalize=True 即可,結(jié)果是小數(shù)形式

可以通過apply,對每一列變量進(jìn)行統(tǒng)計(jì)

以上是自己實(shí)踐中遇到的一些點(diǎn),分享出來供大家參考學(xué)習(xí),歡迎關(guān)注DataShare公眾號

如何在Python中使用static,class,abstract方法

方法在Python中是如何工作的

方法就是一個(gè)函數(shù),它作為一個(gè)類屬性而存在,你可以用如下方式來聲明、訪問一個(gè)函數(shù):

Python

1

2

3

4

5

6

7

8

class Pizza(object):

...???? def __init__(self, size):

...???????? self.size = size

...???? def get_size(self):

...???????? return self.size

...

Pizza.get_size

unbound method Pizza.get_size

Python在告訴你,屬性_get_size是類Pizza的一個(gè)未綁定方法。這是什么意思呢?很快我們就會知道答案:

Python

1

2

3

4

Pizza.get_size()

Traceback (most recent call last):

File "stdin", line 1, in module

TypeError: unbound method get_size() must be called with Pizza instance as first argument (got nothing instead)

我們不能這么調(diào)用,因?yàn)樗€沒有綁定到Pizza類的任何實(shí)例上,它需要一個(gè)實(shí)例作為第一個(gè)參數(shù)傳遞進(jìn)去(Python2必須是該類的實(shí)例,Python3中可以是任何東西),嘗試一下:

Python

1

2

Pizza.get_size(Pizza(42))

42

太棒了,現(xiàn)在用一個(gè)實(shí)例作為它的的第一個(gè)參數(shù)來調(diào)用,整個(gè)世界都清靜了,如果我說這種調(diào)用方式還不是最方便的,你也會這么認(rèn)為的;沒錯(cuò),現(xiàn)在每次調(diào)用這個(gè)方法的時(shí)候我們都不得不引用這個(gè)類,如果不知道哪個(gè)類是我們的對象,長期看來這種方式是行不通的。

那么Python為我們做了什么呢,它綁定了所有來自類_Pizza的方法以及該類的任何一個(gè)實(shí)例的方法。也就意味著現(xiàn)在屬性get_size是Pizza的一個(gè)實(shí)例對象的綁定方法,這個(gè)方法的第一個(gè)參數(shù)就是該實(shí)例本身。

Python

1

2

3

4

Pizza(42).get_size

bound method Pizza.get_size of __main__.Pizza object at 0x7f3138827910

Pizza(42).get_size()

42

和我們預(yù)期的一樣,現(xiàn)在不再需要提供任何參數(shù)給_get_size,因?yàn)樗呀?jīng)是綁定的,它的self參數(shù)會自動地設(shè)置給Pizza實(shí)例,下面代碼是最好的證明:

Python

1

2

3

m = Pizza(42).get_size

m()

42

更有甚者,你都沒必要使用持有Pizza對象的引用了,因?yàn)樵摲椒ㄒ呀?jīng)綁定到了這個(gè)對象,所以這個(gè)方法對它自己來說是已經(jīng)足夠了。

也許,如果你想知道這個(gè)綁定的方法是綁定在哪個(gè)對象上,下面這種手段就能得知:

Python

1

2

3

4

5

6

7

m = Pizza(42).get_size

m.__self__

__main__.Pizza object at 0x7f3138827910

# You could guess, look at this:

...

m == m.__self__.get_size

True

顯然,該對象仍然有一個(gè)引用存在,只要你愿意你還是可以把它找回來。

在Python3中,依附在類上的函數(shù)不再當(dāng)作是未綁定的方法,而是把它當(dāng)作一個(gè)簡單地函數(shù),如果有必要它會綁定到一個(gè)對象身上去,原則依然和Python2保持一致,但是模塊更簡潔:

Python

1

2

3

4

5

6

7

8

class Pizza(object):

...???? def __init__(self, size):

...???????? self.size = size

...???? def get_size(self):

...???????? return self.size

...

Pizza.get_size

function Pizza.get_size at 0x7f307f984dd0

靜態(tài)方法

靜態(tài)方法是一類特殊的方法,有時(shí)你可能需要寫一個(gè)屬于這個(gè)類的方法,但是這些代碼完全不會使用到實(shí)例對象本身,例如:

Python

1

2

3

4

5

6

7

class Pizza(object):

@staticmethod

def mix_ingredients(x, y):

return x + y

def cook(self):

return self.mix_ingredients(self.cheese, self.vegetables)

這個(gè)例子中,如果把_mix_ingredients作為非靜態(tài)方法同樣可以運(yùn)行,但是它要提供self參數(shù),而這個(gè)參數(shù)在方法中根本不會被使用到。這里的@staticmethod裝飾器可以給我們帶來一些好處:

Python不再需要為Pizza對象實(shí)例初始化一個(gè)綁定方法,綁定方法同樣是對象,但是創(chuàng)建他們需要成本,而靜態(tài)方法就可以避免這些。

Python

1

2

3

4

5

6

Pizza().cook is Pizza().cook

False

Pizza().mix_ingredients is Pizza.mix_ingredients

True

Pizza().mix_ingredients is Pizza().mix_ingredients

True

可讀性更好的代碼,看到@staticmethod我們就知道這個(gè)方法并不需要依賴對象本身的狀態(tài)。

可以在子類中被覆蓋,如果是把mix_ingredients作為模塊的頂層函數(shù),那么繼承自Pizza的子類就沒法改變pizza的mix_ingredients了如果不覆蓋cook的話。

類方法

話雖如此,什么是類方法呢?類方法不是綁定到對象上,而是綁定在類上的方法。

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

class Pizza(object):

...???? radius = 42

...???? @classmethod

...???? def get_radius(cls):

...???????? return cls.radius

...

Pizza.get_radius

bound method type.get_radius of class '__main__.Pizza'

Pizza().get_radius

bound method type.get_radius of class '__main__.Pizza'

Pizza.get_radius is Pizza().get_radius

True

Pizza.get_radius()

42

無論你用哪種方式訪問這個(gè)方法,它總是綁定到了這個(gè)類身上,它的第一個(gè)參數(shù)是這個(gè)類本身(記?。侯愐彩菍ο螅?。

什么時(shí)候使用這種方法呢?類方法通常在以下兩種場景是非常有用的:

工廠方法:它用于創(chuàng)建類的實(shí)例,例如一些預(yù)處理。如果使用@staticmethod代替,那我們不得不硬編碼Pizza類名在函數(shù)中,這使得任何繼承Pizza的類都不能使用我們這個(gè)工廠方法給它自己用。

Python

1

2

3

4

5

6

7

class Pizza(object):

def __init__(self, ingredients):

self.ingredients = ingredients

@classmethod

def from_fridge(cls, fridge):

return cls(fridge.get_cheese() + fridge.get_vegetables())

調(diào)用靜態(tài)類:如果你把一個(gè)靜態(tài)方法拆分成多個(gè)靜態(tài)方法,除非你使用類方法,否則你還是得硬編碼類名。使用這種方式聲明方法,Pizza類名明永遠(yuǎn)都不會在被直接引用,繼承和方法覆蓋都可以完美的工作。

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

class Pizza(object):

def __init__(self, radius, height):

self.radius = radius

self.height = height

@staticmethod

def compute_area(radius):

return math.pi * (radius ** 2)

@classmethod

def compute_volume(cls, height, radius):

return height * cls.compute_area(radius)

def get_volume(self):

return self.compute_volume(self.height, self.radius)

抽象方法

抽象方法是定義在基類中的一種方法,它沒有提供任何實(shí)現(xiàn),類似于Java中接口(Interface)里面的方法。

在Python中實(shí)現(xiàn)抽象方法最簡單地方式是:

Python

1

2

3

class Pizza(object):

def get_radius(self):

raise NotImplementedError

任何繼承自_Pizza的類必須覆蓋實(shí)現(xiàn)方法get_radius,否則會拋出異常。

這種抽象方法的實(shí)現(xiàn)有它的弊端,如果你寫一個(gè)類繼承Pizza,但是忘記實(shí)現(xiàn)get_radius,異常只有在你真正使用的時(shí)候才會拋出來。

Python

1

2

3

4

5

6

7

Pizza()

__main__.Pizza object at 0x7fb747353d90

Pizza().get_radius()

Traceback (most recent call last):

File "stdin", line 1, in module

File "stdin", line 3, in get_radius

NotImplementedError

還有一種方式可以讓錯(cuò)誤更早的觸發(fā),使用Python提供的abc模塊,對象被初始化之后就可以拋出異常:

Python

1

2

3

4

5

6

7

8

import abc

class BasePizza(object):

__metaclass__??= abc.ABCMeta

@abc.abstractmethod

def get_radius(self):

"""Method that should do something."""

使用abc后,當(dāng)你嘗試初始化BasePizza或者任何子類的時(shí)候立馬就會得到一個(gè)TypeError,而無需等到真正調(diào)用get_radius的時(shí)候才發(fā)現(xiàn)異常。

Python

1

2

3

4

BasePizza()

Traceback (most recent call last):

File "stdin", line 1, in module

TypeError: Can't instantiate abstract class BasePizza with abstract methods get_radius

混合靜態(tài)方法、類方法、抽象方法

當(dāng)你開始構(gòu)建類和繼承結(jié)構(gòu)時(shí),混合使用這些裝飾器的時(shí)候到了,所以這里列出了一些技巧。

記住,聲明一個(gè)抽象的方法,不會固定方法的原型,這就意味著雖然你必須實(shí)現(xiàn)它,但是我可以用任何參數(shù)列表來實(shí)現(xiàn):

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

import abc

class BasePizza(object):

__metaclass__??= abc.ABCMeta

@abc.abstractmethod

def get_ingredients(self):

"""Returns the ingredient list."""

class Calzone(BasePizza):

def get_ingredients(self, with_egg=False):

egg = Egg() if with_egg else None

return self.ingredients + egg

這樣是允許的,因?yàn)镃alzone滿足BasePizza對象所定義的接口需求。同樣我們也可以用一個(gè)類方法或靜態(tài)方法來實(shí)現(xiàn):

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

import abc

class BasePizza(object):

__metaclass__??= abc.ABCMeta

@abc.abstractmethod

def get_ingredients(self):

"""Returns the ingredient list."""

class DietPizza(BasePizza):

@staticmethod

def get_ingredients():

return None

這同樣是正確的,因?yàn)樗裱橄箢怋asePizza設(shè)定的契約。事實(shí)上get_ingredients方法并不需要知道返回結(jié)果是什么,結(jié)果是實(shí)現(xiàn)細(xì)節(jié),不是契約條件。

因此,你不能強(qiáng)制抽象方法的實(shí)現(xiàn)是一個(gè)常規(guī)方法、或者是類方法還是靜態(tài)方法,也沒什么可爭論的。從Python3開始(在Python2中不能如你期待的運(yùn)行,見issue5867),在abstractmethod方法上面使用@staticmethod和@classmethod裝飾器成為可能。

Python

1

2

3

4

5

6

7

8

9

10

11

12

import abc

class BasePizza(object):

__metaclass__??= abc.ABCMeta

ingredient = ['cheese']

@classmethod

@abc.abstractmethod

def get_ingredients(cls):

"""Returns the ingredient list."""

return cls.ingredients

別誤會了,如果你認(rèn)為它會強(qiáng)制子類作為一個(gè)類方法來實(shí)現(xiàn)get_ingredients那你就錯(cuò)了,它僅僅表示你實(shí)現(xiàn)的get_ingredients在BasePizza中是一個(gè)類方法。

可以在抽象方法中做代碼的實(shí)現(xiàn)?沒錯(cuò),Python與Java接口中的方法相反,你可以在抽象方法編寫實(shí)現(xiàn)代碼通過super()來調(diào)用它。(譯注:在Java8中,接口也提供的默認(rèn)方法,允許在接口中寫方法的實(shí)現(xiàn))

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

import abc

class BasePizza(object):

__metaclass__??= abc.ABCMeta

default_ingredients = ['cheese']

@classmethod

@abc.abstractmethod

def get_ingredients(cls):

"""Returns the ingredient list."""

return cls.default_ingredients

class DietPizza(BasePizza):

def get_ingredients(self):

return ['egg'] + super(DietPizza, self).get_ingredients()

這個(gè)例子中,你構(gòu)建的每個(gè)pizza都通過繼承BasePizza的方式,你不得不覆蓋get_ingredients方法,但是能夠使用默認(rèn)機(jī)制通過super()來獲取ingredient列表。

打賞支持我翻譯更多好文章,謝謝!


本文標(biāo)題:python中的頂層函數(shù) c++頂層函數(shù)
標(biāo)題路徑:http://weahome.cn/article/hhjcos.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部