python基礎語法知識點總結

weixin_42053726發表於2018-12-29

目錄

 

3、python語法:

3.1、三元運算子:簡化程式碼的功能

3.2、if else 寫到一行裡的簡潔寫法:

3.3、位元組碼型別或者說2進位制型別(bytes)和字串型別以及相互轉換

3.4、集合set

3.5 enumerate()函式,列舉的意思,

3.6、字串操作:

3.7、檔案操作:

3.8、高階函式:函式名字可以當成引數穿進去

3.9、裝飾器(詳細講解)

3.10函式的不固定引數(位置引數和關鍵字引數)

3.12、迭代器與生成器

4、json   :和xml一樣逐漸被json淘汰

5、跨目錄呼叫檔案

6、python組織目錄  (爬蟲和其他的有自己的特別目錄)

7、引用深度拷貝淺拷貝的解析:推薦用深度拷貝


 

3、python語法:

3.1、三元運算子:簡化程式碼的功能

x = a if a>b else b  # 如果a>b 則x = a ,否則 x= b

3.2、if else 寫到一行裡的簡潔寫法:

a, b, c = 1, 2, 3
if a>b:

    c = a

else:

    c = b

'''
等價於
'''
c = a if a>b else b
'''
意思是如果a>b,則,讓c=a,否則,讓c=b
'''

3.3、位元組碼型別或者說2進位制型別(bytes)和字串型別以及相互轉換

文字資料用的是字串,但是音訊視訊用的是位元組型別,socket 網路傳輸必須是2進位制,因此要轉換bytes,其他情況用str

3.4、集合set

set函式直接可以把列表重複的元素給去掉,集合是無序的

'''
集合是數學上的集合,無序,沒有重複元素的 物件
'''
list1 = [1,2,1,3,4,2]
a = set(list1)
print(a,type(a))
# {1, 2, 3, 4} <class 'set'>  變成集合後將重複元素去掉

'''
相關操作增加和刪除元素 , 求長度,
'''
a.add(999)  #在集合中新增一個元素,
a.update([111,222,333])  # 新增多個元素

a.remove(111) #刪除一個元素,沒有這個元素則報錯
a.discard(111)  #沒有這個元素不報錯

len(a)
x in a  #判斷x是不是a的元素,適用於列表元組,字典,集合,字串
x not in a
'''

兩個集合取交集,並集,差集(我有你沒有的),判斷是否是子集,父集
可以用函式表示,也可以用符號表示
'''
a = set([1,2,1,3,4,2])
b = set([1,4,5,6])
''' 交集 '''
a.intersection(b)   或者 
a & b
a.isdisjoint(b) #判斷是不是沒有交集
#{1, 4}    
''' 並集 '''
a.union(b)  #並集   或者  
a | b 
''' 差集 '''
a.difference(b))#差集,a有,b沒有       
a - b
''' 判斷是否是子集父集 '''
a.issubset(b)  #判斷a是不是b的子集
a.issuperset(b)  #判斷a是不是b的父集
''' 對稱差集 '''
a.symmetric_difference(b)  # 判斷對稱差集 (將a和b裡面相互沒有的元素取出來,相當於
a.intersection(b).union(b.intersection(a))   :兩個差集並在一起 )
a ^ b

3.5 enumerate()函式,列舉的意思,

print(list(enumerate([1,2,3]))) #

[(0, 1), (1, 2), (2, 3)]

3.6、字串操作:

line = 'a b c'
line.strip()  #把 \n 換行符去掉

'aaa'.encode('utf-8')

3.7、檔案操作:

'''
windows系統預設編碼GBK格式編碼,如果不指定編碼,則預設用作業系統的編碼(window:GBK)開啟
而python是使用utf-8處理檔案所有語言讀取檔案,其實不是這個語言讀取的,而是呼叫作業系統的IO介面讀取的,f.fileno() 表示開啟了幾個檔案了好像是
# f 是一個記憶體物件(也叫控制程式碼),這個物件包含很多東西,比如檔名,內容,地址等等
r w a r+ w+ a+    rb   

# mode='r','w':建立檔案覆蓋之前的了,太危險了 'a' :append  不可以讀可以寫 ;'r+' :可以讀可以寫
# 'w+','a+'  同理  ,寫入 不管什麼時候只能在最後寫,無法再半截處寫
# 'rb' :以二進位制方式讀入,文字檔案這樣讀就報錯了,去掉encoding就好了,但是結果不一樣了,用於讀取視訊圖片等資訊
#網路傳輸(python2還可以用字串傳輸,但是3不可以了必須用二進位制傳輸)
'''
f = open("port.csv",mode='r', encoding="utf-8")

'''讀取內容'''
for line in f :
    print(line)  # 高效讀取檔案,把f變成迭代器了

d2 = f.read()  # 讀取檔案,有點像指標是的,到d2這裡什麼都沒有,讀不出來,可以把游標移回到原來的初始位置
d1 = f.read(5) # 加入引數讀取5個字元,預設為全部讀取  f.readable()  判斷能不能讀
d3= f.readline() # 讀一行,
data=f.readlines() # 這個是讀出來所有內容放到列表裡面,第一個元素是第一行內容...


'''寫入檔案'''
f.write('1,\n') # f.writable() 判斷能不能寫
f.write('2')
f.write('aaa'.encode('utf-8'))

'''
檢視游標 編碼 檔名
'''
print(f.tell()) # 告訴 我游標在何處
print(f.seek(0))  # 將游標設在0處  並不是所有檔案都能移動的,比如Linux一切都是檔案,有些東西以動不了檢視能不能移 用 f.seekable()
print(f.encoding)  # 列印什麼編碼
print(f.name)  # 列印檔名字

3.8、高階函式:函式名字可以當成引數穿進去

3.9、裝飾器(詳細講解

import time
def timer(func):
    def decorate(*arg,**kwargs): # 不固定引數
        '''
        :param arg:   將接受的引數 由元組包裹起來
        :param kwargs:  將接受的引數 有字典包括起來,
        :return:
        '''
        star_time = time.time()
        func(*arg,**kwargs)
        stop_time = time.time()
        print(stop_time-star_time)
    return decorate
@timer  # 這一步等於 test1 = timer(test1)
def test1():
    time.sleep(3)
    print('test1')
@timer
def test2():
    time.sleep(3)
    print('test2')

test1()
'''
這句話看似呼叫了test1 這個函式了,但是錯了,以及被偷樑換柱了,
由於被裝飾器修飾了,test1 = timer(test1),test1已經被換了換成了decorate函式了,只不過用test1覆蓋了
除錯時候就可以看出來了,
@timer  這一步其實以及偷偷執行timer程式了
'''

test2()

函式呼叫函式,函式順序不影響結果,C語言不一樣,

原來我們怎麼裝飾其他函式的,說白了就是把新建一個函式把原來的函式當成引數穿進去,修改了呼叫方式。

在早些時候 (Python Version < 2.4,2004年以前),為一個函式新增額外功能的寫法是這樣的。

def debug(func):
    def wrapper():
        print "[DEBUG]: enter {}()".format(func.__name__)
        return func()
    return wrapper

def say_hello():
    print "hello!"

say_hello = debug(say_hello)  # 新增功能並保持原函式名不變

函式引數如果是傳入函式,不能加括號,加上括號就不是高階函式了

3.10函式的不固定引數(位置引數和關鍵字引數)

    def decorate(*arg,**kwargs): # 不固定引數
        '''
        :param arg:   將接受的引數 由元組包裹起來
        :param kwargs:  將關鍵字引數 有字典包括起來,

3.12、迭代器與生成器

'''python2 和python3  range的區別
生成器節約記憶體,時間快,在for迴圈中使用非常好
'''

a = [i for i in range(10000000000)]  # 這個是生成  迭代器
b = (i for i in range(10000000000))  # 生成器,根本沒有生成這些數字,只有訪問時候才有不支援
a[0],只在for迴圈中使用

b.__next__()  #只有這個方法,只能記住當前的位置,

'''
可以自己寫一個生成器 比如 斐波那契數列
'''
yield   關鍵字

 

4、json   :和xml一樣逐漸被json淘汰

這是所有語言都預設支援的格式,用於不同語言的互動,比如python的json 轉到Java的json

但是在python中只能儲存簡單的格式,比如字典,列表

 

5、跨目錄呼叫檔案

pycharm 新增一次似乎永久保留了,path路徑,但是在其他工程下則沒有

'''
下面的程式碼是kuamulu.py的檔案程式碼
匯入包時候在__init__.py檔案會被執行,裡面假如有import numpy這個語句,不會在kuamulu.py
中好用的,會報錯
跨目錄呼叫檔案:
將檔案的絕對路徑動態載入到環境變數中去,但是不能寫死了。否則在其他電腦上不能使用
# print(__file__) #列印相對路徑
os.path.abspath(__file__) #列印絕對路徑,但是還帶著檔名字,需要去掉檔名,
# dirname :當前目錄的上一級目錄  應用兩次
'''
import os
import sys
file_namepath=os.path.abspath(__file__) # 找到本檔案目錄包括檔案 #C:\Users\zjw\PycharmProjects\untitled\test.py
father_path = os.path.dirname(file_namepath) #找到本檔案目錄不包括檔案
print(father_path)
base_dir = os.path.dirname(father_path) #找到本檔案目錄的上一級目錄相當 ../
print(base_dir) #  C:\Users\zjw\PycharmProjects\kuamulu
sys.path.append(base_dir)
from conf  import conf  # 從包中匯入模組 會執行conf 包裡的__init__.py
from  main import main  # 從包中匯入模組 會執行main 包裡的 __init__.py
conf.conf1()
main.fff()

6、python組織目錄  (爬蟲和其他的有自己的特別目錄)

7、引用深度拷貝淺拷貝的解析:推薦用深度拷貝

參考網站:https://www.cnblogs.com/alinh/p/6603976.html  照的這個來就可以了

#例子
a = [1, 2, 3, 4, ['a', 'b']] #原始物件
  
b = a                       #賦值,傳物件的引用

#修改a的值,這時候b也被修改了[1, 2, 3, 4, ['a', 'b'], 1]
a.append(5)                 #修改物件a

 

 

相關文章