python筆記 - day3

                        python筆記 - day3                        

參考:http://www.cnblogs.com/wupeiqi/articles/5453708.html

set特性:

  1.無序
  2.不重複
  3.可嵌套

函數:

  函數的做用:函數就是封裝某一個功能的;html

    1.def聲明函數
    2.要有一個函數名
    3.函數體
    4.返回值,return返回值,若是不定義返回0
  5.定義函數,函數體不執行;調用函數,函數體內容纔會執行

函數語法:

def  t1():  形式參數
print("aa")
t1() 實際參數

參數類型:

1.普通參數
2.默認參數 (必須放到參數列表的最後)
3.指定參數(將實際參數賦值給指定的形式參數)
4.動態參數:
        *  默認傳入的參數,所有放置在元組中;
        **默認傳入的參數,所有放置在字典中
5.萬能參數   
   *args,**kwargs

變量:

全局變量,全部做用域均可讀;
對全局便令進行{從新賦值},須要global;
特殊全局變量:列表。字典,可修改,不可從新賦值;
之後定義全局變量,變量名都要大寫,潛規則;
 

函數應用示例:

例一:
【形式參數:*args,把傳入的參數都會以元組的形式打印出來;也會把列表當成一個元素傳入到元組裏
def f1(*args): print(args,type(args)) f1(11,22,44,'alex') li = [11,22,'alex','hhh'] f1(li,12)
【實際參數:*,把列表裏面的元素傳入到元組裏面
f1(*li)

實際參數:*,把字符串的每個元素傳入到元組裏面】 li
= "name" f1(*li)
例二:
【**args兩個*輸出的數據類型爲字典,因此傳入的參數也必須爲兩個值】 def f1(
**args): print(args,type(args)) f1(n1="alex",n2=18 )
【kk爲字典的key,定義的dic爲字典kk的value】 dic
= {'k1':'v1','k2':'v2'} f1(kk=dic)
【**,把dic字典,以字典形式賦值給args並打印出來】 f1(
**dic)
【萬能參數,前面是數組,後面是列表】 def f1(
*args,**kwargs): print(args) print(kwargs) f1(11,22,33,44,k1='v1',k2='v2') 【python傳參數傳的是引用當前變量,不是從新賦值一份】 def f1(a1): a1.append(999) li = [11,22,33,44] f1(li) print(li) 【全局變量,變量名用大寫】 name = 'alex' def f1(): global name #全局變量,變量名用大寫 name = 'freddy' age = 18 print(age,name) def f2(): age = 19 print(age,name) f1() f2()

函數:發送郵件,並判斷是否成功:

例一,沒有傳參:
def sendmail ():
try:
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

msg = MIMEText('test mail', 'plain', 'utf-8')
msg['From'] = formataddr(["武沛齊",'wptawy@126.com'])
msg['To'] = formataddr(["走人",'1011464647@qq.com'])
msg['Subject'] = "主題"

server = smtplib.SMTP("smtp.126.com", 25)
server.login("wptawy@126.com", "WW.3945.59")
server.sendmail('wptawy@126.com', ['1011464647@qq.com',], msg.as_string())
server.quit()
except:
return False
else:
return True
res = sendmail()
if res == False:
print("Send mail Fail.")
else:
print("Send mail Seucess.")


例二,帶傳參:1.收件人 2.郵件內容 3.默認參數:
def sendmail (xxoo,content,xx="OK"):
print(xxoo,content,xx)
try:
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

msg = MIMEText(content, 'plain', 'utf-8')
msg['From'] = formataddr(["武沛齊",'wptawy@126.com'])
msg['To'] = formataddr(["走人",'1011464647@qq.com'])
msg['Subject'] = "主題"

server = smtplib.SMTP("smtp.126.com", 25)
server.login("wptawy@126.com", "WW.3945.59")
server.sendmail('wptawy@126.com', [xxoo,], msg.as_string())
server.quit()
except:
return False
else:
return True
res = sendmail('1011464647@qq.com',"sb")
if res == False:
print("Send mail Fail.")
else:
print("Send mail Seucess.")


例3:進階,手動輸入收件人郵件地址;
def sendmail (xxoo,content,xx="OK"):
print(xxoo,content,xx)
try:
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

msg = MIMEText(content, 'plain', 'utf-8')
msg['From'] = formataddr(["武沛齊",'wptawy@126.com'])
msg['To'] = formataddr(["走人",'1011464647@qq.com'])
msg['Subject'] = "主題"

server = smtplib.SMTP("smtp.126.com", 25)
server.login("wptawy@126.com", "WW.3945.59")
server.sendmail('wptawy@126.com', [xxoo,], msg.as_string())
server.quit()
except:
return False
else:
return True
while True:
em = input("mail addr:")
result = sendmail(em,"SB")
#傳入時間參數,em:收件人地址;SB,是郵件內容;
# result = sendmail(xxoo=em,content="SB")
#指定參數,
if result == 'False':
print('send mail fail.')
else:
print('send mail secuess')


 函數:以函數的形式寫代碼示例:

readme:

1.這個程序包含一個主程序文件,一個存放帳號密碼的文件;python

2.存放密碼的文件,帳號和密碼的分隔符爲「|」json

主程序:

 1 #!/usr/bin/python env
 2 #_*_coding:utf-8 _*_
 3 
 4 def login(username,password):
 5     """
 6     用於用戶登錄
 7     :param username: 用戶輸入的用戶名
 8     :param password: 用戶輸入的密碼
 9     :return: Ture,登錄成功;False,登錄失敗;
10     """
11     f = open('db','r+')
12     for line in f.readlines():
13         line = line.split("|")
14         if line[0] == username and line[1] == password:
15             return True
16     return False
17 
18 
19 def register(username,password):
20     """
21     用於用戶註冊
22     :param username: 註冊用戶名
23     :param password: 註冊用戶密碼
24     :return:  默認None
25     """
26     f = open('db','a')
27     temp = "\n" + username + "|" + password
28     f.write(temp)
29     f.close()
30 
31 
32 def main():
33     t = input("1,login  2.register:")
34     if t == '1':
35         user = input("user:")
36         pwd = input("passwd:")
37         r = login(user,pwd)
38         if r == True:
39             print("login secuess")
40         else:
41             print("login fail")
42     elif t == '2':
43         user = input("user:")
44         pwd = input("passwd:")
45         register(user,pwd)
46 main()

語法糖:

【三元運算,三目運算】
1.正常寫法:
if 1 == 1:
    name = "freddy"
else:
    name = "SB"
思路:
    1.先判斷條件,若是1=1,name就等於freddy,
    2.不然,name就等於SB;

2.三目寫法:
name = "freddy" if 1 == 1 else "SB"
print(name)
思路:
    1.我想要name等於freddy,想要達到什麼條件,
    2.不然,就是SB;

【lambda,】
1.正常寫法:
def t1(a1):
    return a1 +100
res = t1(10)
print(res)

2.lambda寫法:
f2 = lambda a1: a1 +110
ret = f2(10)
print(ret)
語法解析:
  1.f2 = lambda #函數名+lambda
  2.a1 #形式參數
  3. a1 + 100 #函數內執行主體內容
2.1.之lambda + 2個函數: f2 = lambda a1,a2: a1 + a2 +110 ret1 = f2(10,1) print(ret1) 2.2.之lambda + 2個函數 + 默認參數: f2 = lambda a1,a2=2: a1 + a2 +110 ret2 = f2(10) print(ret2)

內置函數:

【abs,絕對值】
n = abs(-1)
print(n)

【bool,】
print(bool(1))
結果:True
print(bool(" "))
結果:True
print(bool())
結果:False
print(bool(0))
結果:False
print(bool(None))
結果:False
print(bool([]))
結果:False

【all(),全部爲Ture,才爲真;】
【能夠被迭代,循環的對象】
n = all([1,2,3,4])  
print(n)

【any(),只要有一個爲真就是真】
n = any([1,[],0,"",None])
print(n)

【bin(),把5轉換成2進制】
print(bin(5))
結果:0b101  #0b表示轉成的是2進制
【oct(),把9轉換成8進制】
print(oct(9)) 結果:0o11 #0o表示是8進制
【hen(),把15轉換成16進制】
print(hex(15)) 結果:0xf  #0x表示是16進制
【bytes(),字符串轉換成字節】 s
= '勝偉' n = bytes(s,encoding="utf-8") print(n) n = bytes(s,encoding="gbk") print(n) 【str(),把字節轉換成字符串用str】 nn = str(bytes("勝偉",encoding="utf-8"),encoding="utf-8") print(nn)

函數默認沒有返回值,返回None
li = [11,22,33,44]
def f1(arg):
arg.append(55)
li = f1(li) #讓li從新等於了函數的返回值None
print(li)

結果:None


li = [11,22,33,44]
def f1(arg):
arg.append(55)
return arg #增長了return
li = f1(li)
print(li)
結果:[11, 22, 33, 44, 55]
li = [11,22,33,44]
def f1(arg):
arg.append(55)
f1(li)  #直接打印li的值
print(li)
結果:[11, 22, 33, 44, 55]
bytes:把「唐勝偉」轉換成utf-8的格式】
s = "唐勝偉"
ss = bytes(s,encoding='utf-8')
print(ss)
前言:在ASSCII碼錶中,第65位是大寫字母A;
【chr:把ASCII數字轉換成字母】
r = chr(65)
print(r)
結果:A

【ord:把大寫字母A,轉換成ASCII對應的數字】
a = ord("A")
print(a)

結果:65
【compile:就是把字符串編譯成python代碼】
exec:執行python代碼】
s = "print(123)"
r = compile(s,"<string>","exec")
exec(r)
eval:把字符串經過evel轉成python代碼來執行】
s = "8*8"
ret = eval(s)
print(ret)
總結:
exec():能執行python全部的東西;
eval():只能執行python表達式,而且evel有返回值;
exec():執行python代碼,或者字符串;
eval():執行表達式,並返回結果;


【dir():dir():獲取python內置方法的功能】
print(dir(list))
help(list)
divmod:取商和餘數,在作分頁的時候使用】
r = divmod(100,10)
print(r)

print(r[0])
print(r[1])

r1,r2 = divmod(100,5)
print(r1,r2)
【isinstance:判斷對象是不是某個類的實例】
【例:判斷對象s是不是str類的實例】
s = "alex"
r = isinstance(s,str)
print(r)
filter:取出列表中大於22的值】
原理:內部實現機制:li的每一個參數都會執行f2方法,若是條件成立,返回Ture,並把結果賦值給result,返回False不作處理;

例一,不使用filter:
def f1(args):
result = []
for item in args:
if item > 22:
result.append(item)
return result
li = [11,22,33,44,55]
ret = f1(li)
print(ret)



例二,使用filter:
def f2(a):
if a>22:
return True
li = [11,22,33,44,55]
result = filter(f2,li)
#filter(函數,可迭代的對象)
print(list(ret))


lambdalambda會內部作返回值,結果是什麼就會返回什麼】
f1 = lambda a: a > 30
ret = f1(90)
print(ret)

結果:True

filter+lambda:若是返回True,則把結果賦值給result】
li = [11,22,33,44,55]
result = filter(lambda a: a >33,li)
print(list(result))

結果:[44, 55]

【map:需求,每一個元素加100
[map語法:map(函數,可迭代的對象(能夠for循環的東西))]
方法一,原始方法:
li = [11,22,33,44,55]
def f1(args):
result = []
for i in args:
result.append(100+i)
return result
r = f1(li)
print(r)



方法二,進階:
li = [11,22,33,44,55]
def f2(a):
return a + 100
result = map(f2,li)
print(list(result))
方法三,map+lambda:
li = [11,22,33,44,55]
result = map(lambda a: a+ 100,li)
print(list(result))
總結:
filter: 函數返回Ture,將元素添加到結果中;
map: 將函數返回值添加到結果中;


【globals():全局變量,locals(),局部變量

NAME='Freddy'
def show():
a = 123
c = 123
print(locals())
print(globals())
show()
hash:給傳入的對象,轉換成hash值,無論你傳入的值是多長,hash出來值得長度永遠是固定的】
【應用場景:通常都用於成字典的key】
s = 'feawfefeafefafwseesfesfsefwa'
print(hash(s))
【len:】
f = "唐勝偉"
b = len(bytes(f,encoding='utf-8'))
print(len(f))
print(b)


總結:
len:在python3裏面,len的結果就是3,python3中用字符來計算的;
在python2中,len的結果就是9,python2中是用字節來計算的;
max取出來最大的值
r = max([11,22,88,55])
print(r)


【min:取出來最小的值
r = min([11,22,88,55])
print(r)
sum求和
r = sum([11,22,88,55])
print(r)
reversed反轉顯示結果】
li = [11,22,44,33]
r = reversed(li)
print(list(r))
round四捨五入
r = (1.8)
print(r)

結果:2

r = round(1.4)
print(r)

結果:1

【zip:取值方法】
l1 = ['freddy',11,22,33]
l2 = ['is',11,22,33]
l3 = ['sb',11,22,33]

tem = zip(l1,l2,l3)
print(list(tem))

結果:[('freddy', 'is', 'sb'), (11, 11, 11), (22, 22, 22), (33, 33, 33)]

例二:
l1 = ['freddy',11,22,33]
l2 = ['is',11,22,33]
l3 = ['sb',11,22,33]

tem = zip(l1,l2,l3)
* 使用zip進行格式化輸出;

tmp = list(tem)[0]
print(tmp)
('freddy', 'is', 'sb')
* 取出序列化的第一列

ret = ' '.join(tmp)
print(ret)
結果:
freddy  is  sb



文件操做:

【r,只讀】
f =open('db','r')

【w,清空原來db文件,而後再寫入新內容】
f =open('db','w')

【x,文件存在報錯,不存在,建立並寫內容】
f =open('db','x')

【a,追加內容】
f =open('db','a')

【ab,追加寫入;bytes,字節編碼寫入至文件內】
f = open("db",'ab')
f.write(bytes("勝偉",encoding="utf-8"))
f.close()

【讀文件方法:1.utf-8。2.GBK。】
f = open('db','r',encoding='utf-8')  #若是文件是以'utf-8'方式保存的,這裏就要寫一個'utf-8';
f = open('db','r',encoding='GBK')   #若是文件是以gbk方式保存的,這裏就要寫一個GBK;
res = f.read()
print(res)
f.close()

【直接以二進制方式打開文件,優勢:1.跨平臺。2.快。】
f = open('db','rb')
data = f.read()
print(data,type(data))


【若是想以二進制的形式寫入文件,寫入的內容也必須轉成二進制格式】
f = open('db','xb')
f.write(bytes('唐勝偉',encoding='utf-8'))
f.close()
加b,以二進制,字節方式讀
f = open('db','rb')
res = f.read()
f.close()
print(res,type(res))
結果:b'\xe5\x94\x90\xe8\x83\x9c\xe4\xbc\x9f' <class 'bytes'>

【以字符串的方式讀】
f = open('db','r',encoding='utf-8')
res = f.read()
f.close()
print(res,type(res))
結果:唐勝偉 <class 'str'>


【seek(),永遠找的是字節指針位置,一個字母一個字節,一個漢字,若是是utf-8的格式,是三個字節
f = open('db','r+',encoding="utf-8")
data=f.read(1)  #f.read(1):若是以r的方式打開,讀取就是一個字符指針位置;若是以rb的方式打開,讀取就是一個字節指針位置
print(data)
f.seek(1)  #seek(),調整指針的位置,seek的時候,seek的永遠是字節的指針位置
f.write("777")
f.close()
【tell:獲取當前指針的位置,單位永遠是字節】
f = open('db','r+',encoding="utf-8")
data=f.read(1)
print(f.tell())  #f.tell():獲取當前指針的位置,結果是:3,由於一個漢字(字符)佔3位;
f.seek(f.tell())  #在tell獲取的位置開始寫內容,向後覆蓋;
f.write("777")
f.close()

【讀出來的文件類型是,字符串】
f=open('db','r',)
data = f.read()
print(data,type(data))
結果:<class 'str'>
f=open('db','r',encoding='utf-8')
data = f.read()
print(data,type(data))
結果:<class 'str'>
 
     
【rb,以字節方式讀,讀取類型是 字節】
f=open('db','rb',)
data = f.read()
print(data,type(data))

結果:<class 'bytes'>
有b,按照字節讀取;無b,按照字符讀取
f = open('db','r+',encoding='utf-8')
 
     
tell(),獲取當前指針位置
seek(1) 跳轉到指定指針位置
data = f.read(1)  #tell當前指針所在的位置(字節)
print(f.tell())   #調整當前指針的位置(字節)
f.seek(f.tell())   #當前指針位置開始向後覆蓋
f.write('777')   # write() 寫數據,有b,寫字節,沒b,寫字符;

write()
【flush,把緩衝區內容寫入硬盤】
文件1:
f = open('db','a')
f.write("123")
f.flush()
input("str:")

文件2:
f =open('db','r+')
ret = f.read()
print(ret)

readable,判斷是否可寫
f = open('db','w')
ret = f.readable()
print(ret)

readline,一行一行讀,避免讀取數據過大
f = open('db','r')
f.readline()
f.readline()

【truncate,截斷數據,把指針位置後的數據清空】
f = open('db','r+',encoding='utf-8')
f.seek(3)
f.truncate()
f.close()


【一行,一行的讀這個文件】
f = open('db','r+',encoding="utf-8")
for line in f:
print(line)


【with,優勢:不用手動去關閉文件,代碼塊的代碼執行完後會自動關閉文件(f.close)】
思路一:
把f1文件裏面的內容所有寫入到f2:
with open('db1','r',encoding='utf-8') as f1,open('db2','w',encoding='utf-8') as f2:
for line in f1:
f2.write(line)
【把db1的前10行內容寫入到db2文件中】
with open('db','r',encoding='utf-8') as f1,open('db1','w',encoding='utf-8') as f2:
count = 0
for line in f1:
count +=1
if count <= 10:
f2.write(line)
else:
break
思路二:
【把db1文件中的freddy,替換成st】
with open('db1','r',encoding='utf-8') as f1,open('db2','w',encoding="utf-8") as f2:
for line in f1:
new_str = line.replace("freddy",'st')
f2.write(new_str)

 

驗證碼小程序:

 

【例1:生成6位字母驗證碼】
import random
li = []
for i in range(6):
    temp = random.randrange(65,91)
    c = chr(temp)
    li.append(c)

例二驗證碼,程序帶入: 【join的時候元素必須都是字符串】 result
= "".join(li) print(result)
【例二:生成6位,包含兩個數字的驗證碼】
import random li = [] for i in range(6): r = random.randrange(0,5) print(r) if r == 2 or r == 4: num = random.randrange(0,10) li.append(str(num)) ##轉換成字符串類型,不然不能join else: temp = random.randrange(65,91) c = chr(temp) li.append(c) result = "".join(li) print(result)

 

從做業中學到的知識:

【語法技巧】
if True:
print('aa')
tt = True
if tt:
print('aa')


【列表格式的字符串】 s
= "[11,22,33,44,55]" print(s,type(s)) 結果:<class 'str'> 【json:數據序列化,跨平臺傳輸數據】 import json s = "[11,22,33,44,55]" n = json.loads(s) print(n,type(n)) 結果:<class 'list'> #json:將指定格式的字符串,轉換成python的基本數據類型, #注意:字符串形式的字典{"k1":"v1"}的內部字符串必須是雙引號; 【json:格式化輸出】 import json r = input("input dic:") dic = json.loads(r) bk = dic['backend'] rd = "server %s %s weight %d maxconn %d"%(dic['record']['server'], dic['record']['server'], dic['record']['weight'], dic['record']['maxconn']) print(bk) print(rd) 輸入內容:{"backend": "test.oldboy.org","record":{"server": "100.1.7.9","weight": 20,"maxconn": 30}}

 函數重要性:

相關文章
相關標籤/搜索