一 Python 語言中有關復數的概念:
1、虛數不能單獨存在,它們總是和一個值為 0.0 的實數部分一起構成一個復數
2、復數由實數部分和虛數部分構成
3、表示虛數的語法:real+imagej
4、實數部分和虛數部分都是浮點數
5、虛數部分必須有后綴j或J
aa=123-12j
print aa.real # output 實數部分 123.0
print aa.imag # output虛數部分 -12.0
print aa.conjugate # 共軛復數
?
二 關于 (3, 2) < ('a', 'b')? 返回True這件事
首先肯定的是這樣寫并沒有錯誤,前提是py2運行。?py3 不支持不同類型比較,要這樣("3","2") < ("a", "b")。
可是這樣比較我還是第一次看到過,一臉懵逼,隱隱約約覺得比的是ascii,一番查找還真是,詳情見
https://blog.csdn.net/DeskyAki/article/details/100160599? ?這篇文章, 博主寫得很好
?
三 內置的filter,map,reduce
之前接觸過,也會用它,昨天刷筆試題,非得想用lambda裝會B,結果遇到了些麻煩, 廢了一些時間。
1 map? ? [1, 2, 3, 4] --> [1,0, 1, 0]
l = [1, 2, 3, 4]
result = map(lambda i: 0 if i % 2 == 0 else 1, l)
print(list(result))
愚蠢的我企圖map(lambda i: 0 for v in l if v % 2 == 0 else 1, l), 顯然是不對的,map傳的第二個參數是可迭代的,它自動幫你迭代。
而且別忘了list()一下,不這樣打印的是map對象。
2 filter??[1, 2, 3, 4] --> [2,4]
l = [1, 2, 3, 4]
result = filter(lambda i:i if i % 2 == 0 else None, l)
print(list(result))
這里的lambda, 必須寫else,,,
?3 reduce 1到100的階乘
from functools import reduce
result = reduce(lambda a, b: a * b, range(1, 101))
要引入from functools import reduce
下面是利用遞歸
def fun(n):
if n == 1:
return 1
return n * fun(n-1)
c = fun(100)
?
四? s = (1, 2, 3)? ? del s[2]? ?會怎樣?
會報錯啊, 小兄弟。首先集合支持切片操作,是可以拿到值的。
但是,元組值不可修改, 這也包括刪除操作, 不能刪除更新元組的某一個值,del s? 會刪除整個集合。元組連像集合的clear()都沒有,不能清空,只能刪除。更新, 所謂的更新也只是再申請一個內存地址,大概這樣子 ll =( s[1] ,s[0], 66 ), 元組允許重復值,可以比較大小。
但設置了s = (1, 1),在設置s = (2, 3), 打印s,s = (2, 3), 也能實現更新, 不過兩個s的id不同,本質不是一個s。
?
五 關于元組和集合
為什么發這么大標題,因為在看似很簡單的字典和集合中,發現了從未注意的東西。
集合和字典的鍵必須是可哈希的,集合里面不能裝列表,字典的鍵可以是元組,但是可變元組不可以(元組套列表)
Python支持 深度哈希 ,這就是 我們可以使用元組作為字典鍵的原因 ,也是我們可以在集合中使用元組的原因。
>>> a = {['1', '2']}
Traceback (most recent call last):
File "
", line 1, in
TypeError: unhashable type: 'list'
詳見參考?https://blog.csdn.net/DeskyAki/article/details/100160599
?
六 關于*args, **kwargs?
說實話,現在在找工作,還搞這個有些恥ずかしい、但是真有一些細節值得我去深析
def a(*args, **kwargs):
print(args, type(args))
print(*args)
print("xx"*66)
print(kwargs, type(kwargs))
print(*kwargs)
# print(**kwargs)
# 報錯 'c' is an invalid keyword argument for print()
a(m1, m2, c=[1, 2, 3])
([[1, -2, 1], [-3, 4, 1], [1, 1, 1]], [[2, -1, 1], [0, -1, 1], [1, 1, 1]])
[[1, -2, 1], [-3, 4, 1], [1, 1, 1]] [[2, -1, 1], [0, -1, 1], [1, 1, 1]]
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
{'c': [1, 2, 3]}
c
之前我沒想過打印args, *args, kwagrs, *kwagrs, **kwargs, 拿到什么類型的數據, 只是知道這樣可以拿到所有的位置和關鍵字參數,*可以把參數們打亂。
- 打印args, 拿到被元組包裹的所有的位置參數, 元組類型
- 打印*args, 拿到所有的位置參數
- 打印kwargs, 字典類型,關鍵字參數被打成了字典
- 打印*kwargs, 拿到的卻是關鍵字參數的鍵(叫鍵應該對吧)
- 而 打印**kwargs, 報錯,, mmm
幾個小例子
a = [([1, -2, 1], [2, -1, 1])]
print(*a)
# ([1, -2, 1], [2, -1, 1])
* 只能打開一層
a = ([1, -2, 1], [2, -1, 1])
print(*a)
c = zip(*a)
print(list(c))
# [1, -2, 1] [2, -1, 1]
# [(1, 2), (-2, -1), (1, 1)]
雖然打印, 是沒逗號的, 但是zip可以直接用*a
?小例子
li = [lambda:x for x in range(10)]
print(li) # [
.
at 0x0000018062D97268>, ,,,,,,
print(type(li)) # list
print(type(li[0])) # function
res = li[0]()
print(res) # 9
下面序號是任意排的
1? 關于類的多態,我原本以為類的多態,是完全分開的,即使面對列表這種可變類型,看來我想多了,類的多態的列表也是一個吊樣。
class P(object):
n = []
t = "test"
p1 = P()
p2 = P()
print(p1.t) # test
print(p2.t) # test
p1.t = "p1"
print(p1.t) # p1
print(p2.t) # test
p1.n.append(1)
p2.n.append(2)
print(p1.n) # [1, 2]
print(p2.n) # [1, 2]
2 反轉單詞和完全不定個數空格組成的字符串,要求單詞中的字母順序不變。
import re
string = "I like 可愛い もの "
revwords = ''.join(re.split(r"(\s+)", string)[::-1])
print(revwords)
3 關于類的繼承并設置屬性
class Parent(object):
x = 1
class Child1(Parent):
pass
class Child2(Parent):
pass
Child1.x = 2
Parent.x = 3
print(Parent.x, Child1.x, Child2.x)
# 3 2 3
七 關于字典的遍歷和修改鍵
1 遍歷字典,增加或刪除鍵值對時,會報錯
untimeError: dictionary changed size during iteration? 字典在遍歷時改變了長度,
下面兩種都會報錯。。。。
a = {'a': 1, 'b': 0, 'c': 1, 'd': 0}
for key in a.keys():
if key == 'b':
del a[key]
print(a)
a = {'a': 1, 'b': 0, 'c': 1, 'd': 0}
for key in a.keys():
if key == 'b':
a.update({"55": 55})
print(a)
解決: 遍歷時加個list
a = {'a': 1, 'b': 0, 'c': 1, 'd': 0}
for key in list(a.keys()):
if key == 'b':
a.update({"55": 55})
print(a)
2 當遍歷字典時, 修改值不會報錯
a = {'a': 1, 'b': 0, 'c': 1, 'd': 0}
for key in list(a.keys()):
if key == 'b':
a[key] = 66
print(a)
3 字典不能直接修改鍵
可以這樣
a = {"1": 2}
a.update({'c': a.pop("1")})
print(a)
?
八 關于遍歷列表不能修改值的問題
如下, 直接遍歷數組, 直接在遍歷值上做操作,可以該值,但是無法返回到數組,所以數組是不會變的。
可以用第二種方法, 更改數組的值, 想想真是瑟瑟發抖, 想當然的可以直接修改值,要是筆試面試出現這種基礎問題,估計直接涼涼了吧, 闊怕。
列表生成式, 倒是可以直接修改,因為相當于重寫了原來的列表, 實測前后的arr3 id是相同的。
arr = [4, 2, 0, 2, 6, 3, 1]
arr1 = [4, 2, 0, 2, 6, 3, 1]
arr3 = [4, 2, 0, 2, 6, 3, 1]
for i in arr:
i += 1
print(arr)
# [4, 2, 1, 2, 6, 3, 1]
for i in range(len(arr1)):
arr1[i] += 1
print(arr1)
# [5, 3, 2, 3, 7, 4, 2]
q = lambda x: [i+1 for i in x]
print(q(arr3))
# [5, 3, 1, 3, 7, 4, 2]
?
九 關于迭代器和生成器
?一直沒太弄清的概念, 因為覺得會for 循環就好了。為了應對面試,大概看了看,結果都沒考, GG。
迭代器有next, iter? ? ? ? ? 生成器 使用yield
?
迭代器
for 循環 其實就是先iter(), 在next()。如果沒了元素, next()就會拋出? ?StopIteration異常
l1 = [1, 2, 3]
it = iter(l1)
print(next(it)) # 1
print(next(it)) # 2
生成器?
創建迭代器的工具,返回數據要用yield
?
?
?
?
?
?
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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