set集合
集合是一個無序且不重復的元素組合,以大括號表示。使用詳情:
>>> b=set(a) >>> type(b) <class 'set'> >>> print(b) {'hello', 1, 3, 'cc', 'dx'} >>> print(b) {'hello', 1, 3, 'cc', 'dx'} >>> b.add('world') #添加某元素,參數為元素本身 >>> print(b) {1, 'world', 'hello', 3, 'cc', 'dx'}
使用說明:
s.add()添加某元素,參數為元素本身
s.clear() 清空集合
>>> b.clear() >>> print(b) set()
set集合的刪除,有三個s.discard(),s.pop(),s.remove()
其中s.discard() 如果集合中無元素,不報錯;有元素,就刪除
s.pop() 隨機刪除集合中的某個元素,取到元素后返回元素的值,s.pop()不能加目標元素,故頻率略低
s.remove() 刪除目標元素,但集合中如無元素,會報錯
del 不支持set集合的刪除
栗子:
>>> b={'hello', 1, 3, 'cc', 'dx'} >>> type(b) <class 'set'> >>> b.pop('dx') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: pop() takes no arguments (1 given) >>> b.pop() #隨機刪除並取到返回值 'hello' >>> print(b) {1, 3, 'cc', 'dx'} >>> b.remove('cccc') #集合中無元素會報錯 Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'cccc' >>> b.remove('cc') >>> print(b) {1, 3, 'dx'} >>> b.discard('cccc') >>> print(b) {1, 3, 'dx'} >>> b.discard('ccc') #集合中無論有無目標元素,均不報錯 >>> b.discard(1) >>> print(b) {3, 'dx'} >>>
s.difference(b) 取集合s中有,b中沒有的元素,並返回由此元素組成的集合
s.interscetion(b) 交集,兩s和b中的交集,返回s,b中都存在的元素組成的集合
new_dict={1:8,2:4,4:2} old_dict={1:4,2:4,3:2} new_s=set(new_dict) old_s=set(old_dict) print(new_s) print(old_s) in_s=new_s.intersection(old_s) print(in_s) s_del=new_s.difference(old_dict) print(s_del)
結果:
{1, 2, 4} {1, 2, 3} {1, 2} {4}
s.issubset(b) 判斷s是否是b的子集
s.issuperset(b) 判斷s是否是b的父集
栗子:
print(in_s.issubset(new_s)) print(new_s.issuperset(in_s)) 結果: True True
s.intersection_update(b) 取s和b的交集更新s,s成為新集合,集合為s和b的交集
>>> s={1,2,3,4,56,78} >>> b={7,8,9,67,56,78} >>> s.intersection_update(b) >>> print(s) {56, 78} >>> print(b) {67, 7, 8, 9, 78, 56} >>>
s.difference_update(b) 取s和b的交集,s成為新集合,將交集從s中刪除
>>> s={1,2,3,4,56,78} >>> b={7,8,9,67,56,78} >>> b.difference_update(s) >>> print(b) {67, 7, 8, 9} >>> print(s) {1, 2, 3, 4, 78, 56} >>>
s.isdisjoint(b) 判斷是否有交集,如果無交集,返回True
>>> print(b) {67, 7, 8, 9} >>> print(s) {1, 2, 3, 4, 78, 56} >>> s.isdisjoint(b) True >>>
s.symmetric_difference(b) 取差集,並創建一個新的集合
>>> s={1,2,3,4,56,78} >>> b={7,8,9,67,56,78} >>> s.symmetric_difference(b) {1, 2, 67, 3, 4, 7, 8, 9} >>>
s.symmetric_difference_update() 取差集,並將sf為差集本身賦值為差集本身
>>> s={1,2,3,4,56,78} >>> b={7,8,9,67,56,78}>>> s.symmetric_difference_update(b) >>> print(s) {1, 2, 3, 4, 67, 7, 8, 9} >>> print(b) {67, 7, 8, 9, 78, 56} >>>
s.union(b) 並集
>>> print(s) {1, 2, 3, 4, 67, 7, 8, 9} >>> print(b) {67, 7, 8, 9, 78, 56} >>> s.union(b) {1, 2, 3, 4, 67, 7, 8, 9, 78, 56} >>> print(s) {1, 2, 3, 4, 67, 7, 8, 9} >>> print(b) {67, 7, 8, 9, 78, 56} >>>
函數
1.作用域
if 1==1: name='cc' print(name)
結果:
cc
對於變量的作用域,執行聲明並在內存中存在,該變量就可以在下面的代碼中使用。
2.三元運算&三目運算
result = 值1 if 條件 else 值2
如果條件為為真,result=值1,如果條件為假,result=值2
python中的三元運算是以bool值求表達的,if...else...的簡寫。
name = 'alex' if 1==1 else 'sb' print(name)
結果:
alex
3.lambda
lambda表達式其實就是一個簡單的函數:
def f1(a1): return a1+20 f2=lambda a1:a1+20 #同f1 f3=lambda a1,a2:a1+a2+20 #lambda表達式還可使用多個參數 res1=f1(10) res2=f2(10) print(res1) print(res2) print(f3(20,30))
結果:
30 30 70
4.函數
先上一個比較有意思的發送郵件的函數:
def sendmail(): try: import smtplib from email.mime.text import MIMEText from email.utils import formataddr msg = MIMEText('郵件內容', 'plain', 'utf-8') msg['From'] = formataddr(["武沛齊",'wptawy@126.com']) msg['To'] = formataddr(["走人",'424662508@qq.com']) msg['Subject'] = "主題" server = smtplib.SMTP("smtp.126.com", 25) server.login("wptawy@126.com", "WW.3945.5") server.sendmail('wptawy@126.com', ['3628905@qq.com',], msg.as_string()) server.quit() except: # 發送失敗 return "失敗" else: # 發送成功 return "cc" ret = sendmail() print(ret) if ret == "cc": print('發送成功') else: print("發送失敗")
上面函數中,try...except...else 語句,是用來處理python的異常的,然后用return的值判斷發送的結果。
函數的調用:如果設定了return值,可將函數直接賦予一個變量,res=sendmail()即可;如果沒有設置return值,直接執行sendmail()即可,當然這是使用習慣問題,想怎么用自己嘗試吧:)
在函數中,使用return來中斷函數,如果沒有指定函數的return值,那么他的默認值是None.
def f1(): print(123) # 在函數中,一旦執行return,函數執行過程立即終止 return "111" print(456) r = f1() print(r)
執行結果為:
123 111 [Finished in 0.1s]
結果中並未打印456。
def f2(): print(123) r = f2() print(r)
結果:
123 None [Finished in 0.1s]
可見函數默認的return值為None
5.函數參數:
函數參數有多種,可分以下幾種:
5.1 普通參數 特點:嚴格按照參數的順序,將實際參數賦值給形式參數
5.2 默認參數 特點:必須放置在參數列表的最后
5.3 指定參數 特點:將實際參數賦值給指定的形式參數
5.4 動態參數
特點:1.*args,默認將傳入的函數,全部放置在元組中,f1(*[11,22,33,44])
2.**args,默認將傳入的函數,全部放置在字典中,f1(**{"kl":"v1", "k2":"v2"})
3.*args,多個參數,自動轉化為tuple,普通方式都是放於元組中,成為其中一個參數,實際參數中前面加*,將其中的字符串或者列表中的每個元素挑選出來放在元組中
5.5 萬能參數 特點:*args,**kwargs,而且順序不能變,**kwargs必須在后面
普通參數、動態參數例子:
s1 = "i am {0}, age {1}".format("alex", 18) #普通參數 print(s1) s2 = "i am {0}, age {1}".format(*["alex", 18]) #動態參數 print(s2)
結果:
i am alex, age 18 i am alex, age 18 [Finished in 0.1s]
指定參數、動態參數例子:
s1 = "i am {name}, age {age}".format(name='alex', age=18) #指定參數 print(s1) dic = {'name': 'alex', "age": 18} s2 = "i am {name}, age {age}".format(**dic) #動態參數 print(s2) 結果: i am alex, age 18 i am alex, age 18 [Finished in 0.1s]
萬能參數例子:
def f1(*args, **kwargs): print(args) print(kwargs) f1(k1="v1") 結果: () {'k1': 'v1'} [Finished in 0.0s]
動態參數:
def f1(*args): print(args, type(args)) f1(11,22,33,44) li = [11,22,33,44] f1(*li) 結果: (11, 22, 33, 44) <class 'tuple'> (11, 22, 33, 44) <class 'tuple'> [Finished in 0.1s]
動態參數:
def f(*args): print(type(args),args) f('alex') f([1,1,2,3,4,]) f('alex','cc') f([1,2,4,6,8,],'alex') f(*[12,4,6,7,],'alex') 結果: <class 'tuple'> ('alex',) <class 'tuple'> ([1, 1, 2, 3, 4],) <class 'tuple'> ('alex', 'cc') <class 'tuple'> ([1, 2, 4, 6, 8], 'alex') <class 'tuple'> (12, 4, 6, 7, 'alex')
s1='I am {0},age {1}'.format('chengc',18) print(s1) s2='I am {0},age {1}'.format(*['cc',32,]) print(s2) s3='I am {name},age {age}'.format(name='cc',age=21) print(s3) s4='I am {name},age {age}'.format(**{'name':'chengc','age':17}) print(s4) 結果: I am chengc,age 18 I am cc,age 32 I am cc,age 21 I am chengc,age 17
動態參數、指定參數:
def f1(**args): print(args, type(args)) f1(n1="alex", n2=18) dic = {'k1': "v1", "k2":"v2"} f1(kk=dic) dic = {'k1': "v1", "k2":"v2"} f1(**dic) 結果: {'n1': 'alex', 'n2': 18} <class 'dict'> {'kk': {'k2': 'v2', 'k1': 'v1'}} <class 'dict'> {'k2': 'v2', 'k1': 'v1'} <class 'dict'> [Finished in 0.1s]
默認參數:
def send(ooxx,content,xx): print(ooxx,content,xx) return 0 send('water','sdsdf','ddd') 結果: water sdsdf ddd [Finished in 0.1s]
默認參數必須放在最后,默認參數也可被實際參數覆蓋
def send(ooxx,content,xx='bye'): print(ooxx,content,xx) return 0 send('water','sdsdf','exe') 結果: water sdsdf exe [Finished in 0.1s]
萬能參數:
def f(*args,**kwargs): print(args) print(kwargs) f(12,4,5,6,k1='v1',k2='v2') #注意,k1 k2未帶引號 結果: (12, 4, 5, 6) {'k1': 'v1', 'k2': 'v2'} [Finished in 0.1s]
6. 函數參數的傳遞
函數參數傳遞時用的是引用,舉個栗子:
def f(a1): a1.append(9999) li=[12,3,4,5] f(li) print(li) 結果: #注意,已將li列表增加了9999元素, [12, 3, 4, 5, 9999]
參數引用栗子1:
NAME_LI=[1,2,3,4]
def f():
NAME_LI.append('chengc')
# global NAME_LI
# NAME_LI={'k1':'V1'}
print(NAME_LI)
res=f()
print(res)
print(NAME_LI)
結果: #參數引用,已修改
[1, 2, 3, 4, 'chengc']
None
[1, 2, 3, 4, 'chengc']
上面的例子和參數的引用是一碼事,栗子2:
def f(a1): a1.append(9999) name=[12,3,4,5] f(name) print(name) 結果: #注意這個改變了,但f()中為參數, [12, 3, 4, 5, 9999] [Finished in 0.1s]
跟下面的效果也一樣,栗子3:
def f(name): name.append(9999) name=[12,3,4,5] f(name) print(name) 結果: [12, 3, 4, 5, 9999]
7. 函數的全局變量
全局變量,在所有函數中的的作用域都可讀,全局變量一般用全部大寫命名,比如NAME,AGE等。
在作用域中,如果想對全局變量重新賦值,需要用“global”關鍵字。
需要特殊注意的一點:如果全局變量的類型為列表字典等,可修改,但不可以重新賦值。(與global無關),栗子2里有。
栗子1:
NAME_LI=[1,2,3,4] def f(): global NAME_LI NAME_LI={'k1':'V1'} print(NAME_LI) res=f() print(res) print(NAME_LI) 結果: {'k1': 'V1'} None {'k1': 'V1'}
說明:global可改全局變量
栗子2:
NAME_LI=[1,2,3,4] def f(): NAME_LI.append('chengc') NAME_LI={'k1':'V1'} print(NAME_LI) res=f() print(res) print(NAME_LI) 結果: File "/Users/shane/PycharmProjects/Py_study/Base/S3/s3.py", line 42, in <module> res=f() File "/Users/shane/PycharmProjects/Py_study/Base/S3/s3.py", line 36, in f NAME_LI.append('chengc') UnboundLocalError: local variable 'NAME_LI' referenced before assignment
報錯了!說明:作用域中,既使用了全局變量,又想對全局變量重新賦值,是不被允許的。
8. 函數執行時,如果有多次同樣函數名稱的def,以最后一次定義的為准。
這個理解起來簡單,都是按順序執行的,所以就不列例子了。