Python基礎之set集合與函數


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,以最后一次定義的為准。

這個理解起來簡單,都是按順序執行的,所以就不列例子了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM