回過頭去敲循環語句的時候,我又碰到了問題:
var = 1
while var == 1:
... num = int(input("輸入一個數字 :"))
... print("你輸入的數字是: ", num)
...
輸入一個數字 :4
你輸入的數字是: 4
輸入一個數字 :7
你輸入的數字是: 7
輸入一個數字 :7.8
Traceback (most recent call last):
File "", line 2, in
ValueError: invalid literal for int() with base 10: '7.8'
首先input函數永遠返回一個str類型:
a=input("input: ")
input: 6
type(a)
b=input("input: ")
input: 8.9
type(b)
而Int()函數就很神奇,它可以把一個str類型或者一個number轉換成一個整數:
int(3.4)
3
int('100')
100
int('2.3')
Traceback (most recent call last):
File "", line 1, in
ValueError: invalid literal for int() with base 10: '2.3'
int('air')
Traceback (most recent call last):
File "", line 1, in
ValueError: invalid literal for int() with base 10: 'air'
int(float('2.3'))
2
int()函數應該只能將擁有表面意義的字符串直接轉化成整數,也就是說int函數是個封裝,里面應該是有一個內置函數把str轉化成ASCII或者別的啥我也不知道。
而int函數只能把要轉化的string轉化成一個十進制的數,這也就是為什么air無法轉化成數字:a對應了ASCII中的97,97不在0-9之間,大于9的數對int來說就是invalid的。
為了驗證猜想,可以調用int函數的另一個功能:
int(12,16)
Traceback (most recent call last):
File "", line 1, in
TypeError: int() can't convert non-string with explicit base
int('12',16)
18
只有當輸入是一個字符串的時候,他才能把16進制的12轉化成10進制的18。因為int函數里只設置了一個內置函數(一個能將字符串轉化成ASCII碼之類的東西再把ASCII碼轉回來的函數)。
然后我開始學習了正則表達式和面向對象,正則表達式...可能因為東西太多了我沒啥筆記,面向對象就還是有一點點的:
class Test:
... def ppr(self):
... print(self)
... print(self.__class__)
...
t=Test()
t.ppr()
<__main__.Test object at 0x0000019F9A9EA908>
挺簡單的,就是self指一個實例,ppr這個方法里面的print(self)返回了self這個實例的地址;self.__class__則返回了一個類,可以看出Test就是那個類.main應該就是所有東西調用的地方
以__class__,__main__為代表的以雙下劃線為開頭雙下劃線結尾的特殊變量(可以直接訪問的變量)。__class__是什么很好理解,它指向類,在這里應當是Test這個類。然而這個__main__在查了document之后解釋為:the environment where the top-level script is run. The name of the scope in which top-level code executes. A module's __name__is set equal to "__main__" when read from standard input, a script or from an interactive prompt.看上去這個__main__的出現似乎之和運行方式有關。
__name__is a built-in variable which evaluates to the name of the current module.
(大型偷懶現場)
https://stackoverflow.com/que...
https://www.geeksforgeeks.org...
https://www.journaldev.com/17...
前兩個講了__main__和以及和__name__的關系,第三個鏈接講述main函數
感覺今天腦子不轉了:
class A(object):
... def f(self):
... return 123
...
a=A()
print (A.f())
Traceback (most recent call last):
File "", line 1, in
TypeError: f() missing 1 required positional argument: 'self'
print (a.f())
123
第一個A.f()我以為它是一個類方法,它卻返回我缺少位置參數self,self在我眼中代表了一個實例,這不是說明我缺少了一個實例作為參數,也就是說這個A.f()實際是A.f(self)而這個self需要的是一個像a一樣的實例?
a.f()是一個方法,但要是前面的假設是正確的,那么它其實應該是A.f(a)
對我看到了這個:
class Test:
... def ppr():
... print(self)
...
t=Test()
t.ppr()
Traceback (most recent call last):
File "", line 1, in
TypeError: ppr() takes 0 positional arguments but 1 was given
也就是說在定義ppr的時候沒有給self,而t.ppr()在內部處理的時候變成了Test.ppr(t),因為沒有定義參數,所以括號里并不應該給一個變量,所以出現了這個提示。
再加上self:
class Test:
... def ppr(self):
... print(self)
...
t=Test()
t.ppr()
<__main__.Test object at 0x00000241F67CB848>
t.ppr(3)
Traceback (most recent call last):
File "", line 1, in
TypeError: ppr() takes 1 positional argument but 2 were given
t.ppr()=Test.ppr(t),實例地址在0x00000241F67CB848,嗯很完美
t.ppr(3)=Test.ppr(t,3),多給了一個變量,所以提示只需要一個但是給了兩個。
這是問題的前一半,我留了后一半打算慢慢想,因為我試了各種組合發現如下:
class Test:
... def ppr(self):
... print(self)
...
t=Test()
Test.ppr
t.ppr
<__main__.Test object at 0x00000241F67CBA48>>
t.ppr()
<__main__.Test object at 0x00000241F67CBA48>
Test.ppr顯然是一個類方法,但是返回了一個function,或許python中把方法當成了一種特殊函數處理(保留問題)?
t.ppr和t.ppr()返回了同一個地址但是前者返回了綁定了實例的方法的的地址,
后者加了括號,返回的是這個方法的結果,即self的地址,兩個地址是相同的,也沒什么問題
再試一個:
class A(object):
... def f(self):
... return 123
...
A.f
A.f()
Traceback (most recent call last):
File "", line 1, in
TypeError: f() missing 1 required positional argument: 'self'
a=A()
a.f
<__main__.A object at 0x0000027D9CD9C988>>
a.f()
123
a.f返回綁定了實例的方法所在地址,a.f()在這里更直觀一些返回了方法的結果,也沒有問題
那么今天就遺留了一個為什么A.f是一個function而不是一個method的問題。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
