【Python】Python知識點(diǎn)總結(jié)

Python數(shù)據(jù)類型:

字符串' ', " "

# 字符串基本操作
a = 'Life is short, you need Python'
a.lower()                   # 'life is short, you need Python'
a.upper()                   # 'LIFE IS SHORT, YOU NEED PYTHON'
a.count('i')                # 2
a.find('e')                 # 從左向右查找'e'褂萧,3
a.rfind('need')             # 從右向左查找'need',19
a.replace('you', 'I')   # 'Life is short, I need Python'
tokens = a.split()      # ['Life', 'is', 'short,', 'you', 'need', 'Python']
b = ' ---'.join(tokens) # 用指定分隔符把字符串列表組合成新字符串唱凯,Life---is---short,---you---need---Python
c = a + '\n'                # 加了換行符,注意+用法是字符串作為序列的用法
c.rstrip()                  # 右側(cè)去除換行符
[x for x in a]              # 遍歷每個(gè)字符并生成由所有字符按順序構(gòu)成的列表
'Python' in a               # True

# 字符串格式化
a = 'I’m like a {} chasing {}.'
a.format('dog', 'cars') # 按順序格式化字符串磕昼,'I’m like a dog chasing cars.'

b = 'I prefer {1} {0} to {2} {0}'
b.format('food', 'Chinese', 'American')  # 在大括號中指定參數(shù)所在位置
                                         # 貌似這個(gè)功能在Python2.6有舶得,在Python3.6沒了爽蝴?

# >代表右對齊,>前是要填充的字符九孩,依次輸出:
# 000001
# 000019
# 000256
for i in [1, 19, 256]:
    print('The index is {:0>6d}'.format(i))

# <代表左對齊发框,依次輸出:
# *---------
# ****------
# *******---
for x in ['*', '****', '*******']:
    progress_bar = '{:-<10}'.format(x)
    print(progress_bar)

for x in [0.0001, 1e17, 3e-18]:
    print('{:.6f}'.format(x))   # 按照小數(shù)點(diǎn)后6位的浮點(diǎn)數(shù)格式
    print('{:.1e}'.format(x))   # 按照小數(shù)點(diǎn)后1位的科學(xué)記數(shù)法格式
    print ('{:g}'.format(x))    # 系統(tǒng)自動(dòng)選擇最合適的格式

template = '{name} is {age} years old.'
c = template.format(name='Tom', age=8)) # Tom is 8 years old.
d = template.format(age=7, name='Jerry')# Jerry is 7 years old.

# format在生成字符串和文檔的時(shí)候非常有用,更多更詳細(xì)的用法可以參考Python官網(wǎng):
https://docs.python.org/3/library/string.html

列表[]宪拥,list([])(各種元素铣减,通過下表訪問元素,類似C語言的數(shù)組):

# 列表的基本操作有訪問葫哗,增加,刪除校镐,和拼接:
a = [1, 2, 3, 4]
a.pop()             # 把最后一個(gè)值4從列表中移除并作為pop的返回值
a.append(5)         # 末尾插入值捺典,[1, 2, 3, 5]
a.index(2)          # 找到第一個(gè)2所在的位置,也就是1
a[2]                # 取下標(biāo)肝箱,也就是位置在2的值,也就是第三個(gè)值3
a += [4, 3, 2]      # 拼接煌张,[1, 2, 3, 5, 4, 3, 2]
a.insert(1, 0)      # 在下標(biāo)為1處插入元素0,[1, 0, 2, 3, 5, 4, 3, 2]
a.remove(2)         # 移除第一個(gè)2链嘀,[1, 0, 3, 5, 4, 3, 2]
a.reverse()         # 倒序档玻,a變?yōu)閇2, 3, 4, 5, 3, 0, 1]
a[3] = 9            # 指定下標(biāo)處賦值,[2, 3, 4, 9, 3, 0, 1]
b = a[2:5]          # 取下標(biāo)2開始到5之前的子序列误趴,[4, 9, 3]
c = a[2:-2]         # 下標(biāo)也可以倒著數(shù)(-2表示倒數(shù)第二個(gè)元素),方便算不過來的人枣申,[4, 9, 3]
d = a[2:]           # 取下標(biāo)2開始到結(jié)尾的子序列看杭,[4, 9, 3, 0, 1]
e = a[:5]           # 取開始到下標(biāo)5之前的子序列,[2, 3, 4, 9, 3]
f = a[:]            # 取從開頭到最后的整個(gè)子序列模孩,相當(dāng)于值拷貝贮缅,[2, 3, 4, 9, 3, 0, 1]
a[2:-2] = [1, 2, 3] # 賦值也可以按照一段來,并且左右兩邊長度可以不等谴供,[2, 3, 1, 2, 3, 0, 1]
g = a[::-1]         # 將a中元素倒序賦值給g,[6, 5, 4, 3, 2, 1, 0]
g = a[::-2]         # [6, 4, 2, 0]
g = a[::1]          # 將a中元素正序賦值給g龟劲,[0, 1, 2, 3, 4, 5, 6]
a.sort()
print(a)            # 列表內(nèi)排序轴或,a變?yōu)閇0, 1, 1, 2, 2, 3, 3]

# 列表推導(dǎo)式
# 列表推導(dǎo)式的結(jié)構(gòu)是:在一個(gè)方括號里,首先是一個(gè)表達(dá)式蚕愤,隨后是一個(gè) for 子句,然后是零個(gè)或更多的 for 或 if 子句萍诱。
# 返回結(jié)果是一個(gè)根據(jù)表達(dá)從其后的 for 和 if 上下文環(huán)境中生成出來的列表。 
# 示例:
squares = [x**2 for x in range(10)]  # 推導(dǎo)式
print(squares)
# 輸出是[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# 二維列表初始化
2D_list=[ [ 0 for x in range(column) ] for y in range(row) ]

pairs = [(x, y) for x in [1,2,3] for y in [3,1,4] if x!=y]  # 推導(dǎo)式
print(pairs)
# 輸出是[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

元組()包竹,tuple([])(不能被賦值的列表籍凝,類似在列表前修飾const):

c = (5,) # 如果初始化只包含1個(gè)元素的tuple,語法必須明確声诸,必須在元素后加上逗號
b = tuple(['3', 4]) # 也可以從列表初始化

集合{}(用于去重退盯,求集合的∪,∩渊迁,差):

A = set([1, 2, 3, 4])
B = {3, 4, 5, 6}
C = set([1, 1, 2, 2, 2, 3, 3, 3, 3])
print(C)        # 集合的去重效果宫纬,set([1, 2, 3])
print(A | B)    # 求并集膏萧,set([1, 2, 3, 4, 5, 6])
print(A & B)    # 求交集,set([3, 4])
print(A - B)    # 求差集榛泛,屬于A但不屬于B的,set([1, 2])
print(B - A)    # 求差集孤个,屬于B但不屬于A的沛简,set([5, 6])
print(A ^ B)    # 求對稱差集,相當(dāng)于(A-B)|(B-A)给郊,set([1, 2, 5, 6])

字典{key:value,key:value}捧灰,dict(key=value,key=value)

# 字典操作
a = {'Tom': 8, 'Jerry': 7}
print(a['Tom'])             # 8
b = dict(Tom=8, Jerry=7)    # 一種字符串作為鍵更方便的初始化方式
print(b['Tom'])             # 8
if 'Jerry' in a:            # 判斷'Jerry'是否在keys里面
    print(a['Jerry'])        # 7
print(a.get('Spike'))       # None,通過get獲得值,即使鍵不存在也不會(huì)報(bào)異常
a['Spike'] = 10
a['Tyke'] = 3
a.update({'Tuffy': 2, 'Mammy Two Shoes': 42})
print(a.values())   # dict_values([8, 2, 3, 7, 10, 42])
print(a.pop('Mammy Two Shoes'))     # 移除'Mammy Two Shoes'的鍵值對饲窿,并返回42
print(a.keys())     # dict_keys(['Tom', 'Tuffy', 'Tyke', 'Jerry', 'Spike']) 

# 字典排序
# 使用items()或者iteritems()
b = a.items()
print(b)  # [('Tuffy', 2), ('Spike', 10), ('Tom', 8), ('Tyke', 3), ('Jerry', 7)]
from operator import itemgetter
c = sorted(a.items(), key=itemgetter(1)) # 
print(c)  # [('Tuffy', 2), ('Tyke', 3), ('Jerry', 7), ('Tom', 8), ('Spike', 10)]
d = sorted(a.iteritems(), key=itemgetter(1))
print(d)  # [('Tuffy', 2), ('Tyke', 3), ('Jerry', 7), ('Tom', 8), ('Spike', 10)]
e = sorted(a)
print(e)  # 只對鍵排序焕蹄,['Jerry', 'Spike', 'Tom', 'Tuffy', 'Tyke']

# items()可以把字典中的鍵值對轉(zhuǎn)化成一個(gè)列表,其中每個(gè)元素是一個(gè)tuple
# tuple的第一個(gè)元素是鍵嘲驾,第二個(gè)元素是值迹卢。變量c是按照值排序,所以需要一個(gè)操作符itemgetter誊垢,去位置為1的元素作為排序參考症见,
# 如果直接對字典排序,則其實(shí)相當(dāng)于只是對鍵排序谋作。字典被當(dāng)作一個(gè)普通的可遍歷結(jié)構(gòu)使用時(shí),都相當(dāng)于遍歷字典的鍵帖池。

# 另外需要注意的一點(diǎn)是字典是通過哈希表實(shí)現(xiàn)的吭净,所以鍵必須是可哈希的, list不能被哈希囚巴,所以也不能作為字典的鍵友扰,而tuple就可以。

迭代器

# 上段代碼用到了itemgetter()函數(shù)村怪,因此這里插入說一下迭代器(iterator)
# 迭代器相當(dāng)于一個(gè)函數(shù)实愚,每次調(diào)用都返回下一個(gè)元素
# 從遍歷的角度來看就和列表沒有區(qū)別兔辅,區(qū)別是迭代器占用更少內(nèi)存
# 在Python3中击喂,range()就不再產(chǎn)生一個(gè)列表了,而是作為迭代器懂昂,xrange()直接沒了

Python運(yùn)算符

+, -, *, /
%: 求余數(shù)
and:相當(dāng)于C++的&
*在對列表操作時(shí)相當(dāng)于復(fù)制,例如:
g = [0]*3 + [1]*4 + [2]*2 # [0, 0, 0, 1, 1, 1, 1, 2, 2]
**: 冪運(yùn)算符

Python縮進(jìn)

同一層次代碼縮進(jìn)量相同沸柔,建議跨平臺(tái)跨編輯器縮進(jìn)用空格铲敛,因?yàn)橛械木庉嬈?code>tap=2個(gè)空格,有的編輯器tap=4個(gè)空格

Python控制流

if & elif & else 條件結(jié)構(gòu):

# if結(jié)構(gòu)包括三個(gè)關(guān)鍵字:if, elif, else
pets =['dog', 'cat', 'droid', 'fly']

for pet in pets:
    if pet == 'dog':        # 狗糧
        food = 'steak'     # 牛排
    elif pet == 'cat':      # 貓糧
        food = 'milk'       # 牛奶
    elif pet == 'droid':   # 機(jī)器人
        food = 'oil'          # 機(jī)油
    elif pet == 'fly':       # 蒼蠅
        food = 'sh*t'       # ...
    else:
        pass                  # pass 關(guān)鍵字占位用工三,什么也不做
    print(food)

# if表達(dá)式中的小技巧
food = food_for_pet[pet] if pet in food_for_pet else None # 一個(gè)if-else常見的行內(nèi)應(yīng)用先鱼,就是代替三元操作符

if -1 < x < 1:  # 等效于 if x > -1 and x < 1:
    print('The absolute value of x is < 1')

if x in ['piano', 'violin', 'drum']:    # 等效于 if x == 'piano' or x == 'violin' or x =='drum':
    print("It's an instrument!")

food = food_for_pet[pet] if pet in food_for_pet else None

while 循環(huán)結(jié)構(gòu):

while(條件):
     執(zhí)行語句

for 循環(huán)結(jié)構(gòu)(常用):

# 遍歷列表
a=["aa","bb","cc"]
for i in a:
    print(i)

# 常規(guī)循環(huán)
for i in range(0,10): # range(0,10)生成0—9這10個(gè)數(shù)字
    print(i)

# 以上兩種循環(huán)屬于for_each風(fēng)格,C++11中也開始支持這種for循環(huán)方式
# 不過如果還是需要下標(biāo)呢掸读?比如遍歷一個(gè)list的時(shí)候宏多,希望把對應(yīng)下標(biāo)也打印出來
# 這時(shí)可以用enumerate
names = ["Rick", "Daryl", "Glenn"]
for i, name in enumerate(names):
    print(i, name)

# 當(dāng)然你也可以通過下標(biāo)遍歷
words = ["This", "is", "not", "recommended"]
# not pythonic
for i in range(len(words)):
    print(words[i])

break & continue 中斷結(jié)構(gòu):

# break 直接全部退出當(dāng)前循環(huán)模塊 
a=["aa","bb","cc"]
for i in a:
    if (i="bb"):
        break
    print(i)
# continue 中斷當(dāng)前循環(huán)绷落,繼續(xù)下一次循環(huán)
a=["aa","bb","cc"]
for i in a:
    if (i="bb"):
        continue
    print(i)

循環(huán)練習(xí)始苇,輸出乘法口訣表:

# 正序打印乘法口訣表
for i in range(1,10):
    for j in range(1,i+1):
        print(str(i) + "*" + str(j) + "=" +str(i*j), end=" ") # end=" "表示不換行輸出,我在雙引號間加了一個(gè)空格為了美觀
    print()
# 逆序打印乘法口訣表
for i in range(1,10):
    for j in range(i,10):
        print(str(10-i)+"*" + str(10-j)+ "="+str((10-i)*(10-j)),end=" ")
    print()

Python函數(shù)

def 函數(shù)名(參數(shù)1,,參數(shù)2...):
    函數(shù)體

# 注意點(diǎn)
# 默認(rèn)參數(shù)必須放后面函喉,如:
def create_a_list(x, y=2, z=3): # 默認(rèn)參數(shù)項(xiàng)必須放后面
    return [x, y, z]

# lambda匿名函數(shù)
# Lambda表達(dá)式在Python中是一種匿名函數(shù)荣月,lambda關(guān)鍵字后面跟輸入?yún)?shù),然后冒號后面是返回值
some_ops = lambda x, y: x + y + x*y + x**y # 形參是x,y哺窄,返回x + y + x*y + x^y
some_ops(2, 3)  # 2 + 3 + 2*3 + 2^3 = 19

Python生成器(Generator)

# 生成器是迭代器的一種账锹,形式上看和函數(shù)很像坷襟,只是把return換成了yield
# 在每次調(diào)用的時(shí)候婴程,都會(huì)執(zhí)行到y(tǒng)ield并返回值,同時(shí)將當(dāng)前狀態(tài)保存档叔,等待下次執(zhí)行到y(tǒng)ield再繼續(xù):
# 從10倒數(shù)到0
def countdown(x):
    while x >= 0:
        yield x
        x -= 1
for i in countdown(10):
    print(i)
# 可以通過next()函數(shù)返回下一個(gè)值
a=countdown(3)
print(a.next())
print(next(a))
print(next(a))
print(next(a))
# 如果迭代結(jié)束就會(huì)拋出StopIteration異常

Python模塊

import 模塊名
from 模塊名 import 模塊中的方法
模塊的類別:
1. Python自帶模塊(在./python/Lib路徑下)
2. 第三方模塊(pip)
3. 自己寫的模塊(寫好*.py放到./python/Lib路徑下)

Python文件操作衙四、用pickle序列化、轉(zhuǎn)換為JSON標(biāo)準(zhǔn)格式

在Python中传蹈,推薦用上下文管理器(with-as)來打開文件,IO資源的管理更加安全宴胧,而且不用老惦記著給文件執(zhí)行close()函數(shù)

# 打開文件
file=open(文件地址表锻,操作形式(包括:w:寫入,r:讀取,b:以二進(jìn)制形式,a:在文件末尾追加))
# 讀出文件
file.read()
file.readline() # 讀取文件的一行
# 關(guān)閉文件
file.close() #打開文件一定要關(guān)閉
# 寫入文件(覆蓋原來的)
file.write(要寫入的數(shù)據(jù)) # 寫入后一定要關(guān)閉才能保存
# 寫入文件(追加寫入,不覆蓋)
# Python文件操作例子
FilePath='D:\\Code_hub\\test\\tmp1.txt'
data1="data1"
data2="data2"

# 新建文件:file显歧,寫入數(shù)據(jù)确镊,關(guān)閉保存
File=open(FilePath,'w')
File.write(data1)
File.close()

# 文件:file,寫入數(shù)據(jù)(會(huì)將原來文件內(nèi)容覆蓋)蕾域,關(guān)閉保存
File=open(FilePath,'w')
File.write(data2)
File.close()

# 文件:file旨巷,寫入數(shù)據(jù)(在原來文件內(nèi)容后面追加),關(guān)閉保存
File=open(FilePath,'a')
File.write(data2)
File.close()
# 用上下文管理器(with-as)來打開文件
# IO資源的管理更加安全采呐,而且不用惦記著給文件執(zhí)行close()函數(shù)
# open()的第一個(gè)參數(shù)是文件名,第二個(gè)參數(shù)是模式
# 文件的模式一般有四種又固,讀取(r),寫入(w)娄周,追加(a)和讀寫(r+)
# 如果希望按照二進(jìn)制數(shù)據(jù)讀取沪停,則將文件模式和b一起使用(wb, r+b…)
# 現(xiàn)有一文件'name_age.txt'
# 文件內(nèi)容為:
Tom+8
Jerry+7
Tyke+3

with open('name_age.txt', 'r') as f:    # 打開文件,讀取模式
    lines = f.readlines()               # 一次讀取所有行
    for line in lines:                      # 按行格式化并顯示信息
        name, age = line.rstrip().split('+') # rstrip():右側(cè)去除換行符木张;split():以某符號為分隔符劃分字符串
        print('{} is {} years old.'.format(name, age))
# 執(zhí)行后結(jié)果為:
Tom is 8 year old.
Jerry is 7 year old.
Tyke is 3 year old.

# 如果要讀取文件內(nèi)容舷礼,并把年齡和名字的順序交換存成新文件age_name.txt,這時(shí)可以同時(shí)打開兩個(gè)文件:
with open('name_age.txt', 'r') as fread, open('age_name.txt', 'w') as fwrite:
    line = fread.readline()
    while line:
        name, age = line.rstrip().split('+')
        fwrite.write('{}-{}\n'.format(age, name))
        line = fread.readline()
# 此時(shí)age_name.txt文件內(nèi)容為:
8-Tom
7-Jerry
3-Tyke
# 序列化
# 把變量從內(nèi)存中變成可存儲(chǔ)或傳輸?shù)倪^程稱之為序列化
# 在Python中叫pickling妻献,在其他語言中也被稱之為serialization育拨,marshalling,flattening等
# 反過來熬丧,把變量內(nèi)容從序列化的對象重新讀到內(nèi)存里稱之為反序列化,即unpickling
# Python提供了pickle模塊來實(shí)現(xiàn)序列化
import pickle
d = dict(name='Bob', age=20, score=88)
a=pickle.dumps(d) # pickle.dumps()方法把任意對象序列化成一個(gè)bytes害捕,然后闷畸,就可以把這個(gè)bytes寫入文件
print(a)
with open('dumps.txt', 'wb') as f:
    f.write(a)

with open('dump.txt', 'wb') as f:
    pickle.dump(d, f)
# 上述兩段代碼生成的文件dump.txt和dumps.txt內(nèi)容都是一樣的

# 反序列化,使用loads()或load()函數(shù)
a1=pickle.loads(a)
print(a1)

with open('dump.txt', 'rb') as f:
    d = pickle.load(f)
    print(d)
# 轉(zhuǎn)換為JSON標(biāo)準(zhǔn)格式
# 如果我們要在不同的編程語言之間傳遞對象盾沫,就必須把對象序列化為標(biāo)準(zhǔn)格式
# 比如XML倘待,但更好的方法是序列化為JSON
# 因?yàn)镴SON表示出來就是一個(gè)字符串组贺,可以被所有語言讀取,也可以方便地存儲(chǔ)到磁盤或者通過網(wǎng)絡(luò)傳輸
# JSON不僅是標(biāo)準(zhǔn)格式啊奄,并且比XML更快,而且可以直接在Web頁面中讀取菇夸,非常方便。
# Python內(nèi)置的json模塊提供了非常完善的Python對象到JSON格式的轉(zhuǎn)換
import json
d= dict(name='Bob',age=20,score=88)
a=json.dumps(d) # 使用dumps()方法序列化為JSON鞠眉,也可以使用dump()
print(d)
print(type(d))
print(a)
print(type(a))
# 控制臺(tái)輸出為:
{'name': 'Bob', 'age': 20, 'score': 88}
<class 'dict'>
{"name": "Bob", "age": 20, "score": 88}
<class 'str'>

# 反序列化
# 跟上文一樣用loads()或load()方法
d1=json.loads(a)
print(d1)
print(type(d1))
# 控制臺(tái)輸出為:
{'name': 'Bob', 'age': 20, 'score': 88}
<class 'dict'>
# 將Python中的對象(可以先看Python面向?qū)ο缶幊淘賮砜矗┬蛄谢蒍SON對象
import json
class Student(object):
    def __init__(self,name='NoOne',age=0,score=0):
        self.name=name
        self.age=age
        self.score=score
s = Student('Bob', 20, 88)

# 默認(rèn)情況下择诈,dumps()方法不知道如何將Student實(shí)例變?yōu)橐粋€(gè)JSON的{}對象
# 可選參數(shù)default就是把任意一個(gè)對象變成一個(gè)可序列為JSON的對象
# 我們只需要為Student專門寫一個(gè)轉(zhuǎn)換函數(shù)羞芍,再把函數(shù)傳進(jìn)去即可
def student2dict(std):
    return {
        'name': std.name,
        'age': std.age,
        'score': std.score
    }
print(json.dumps(s,default=student2dict))

# 一般類的實(shí)例中都會(huì)有一個(gè)__dict__屬性,它就是一個(gè)dict
# 可以偷懶一點(diǎn)不寫實(shí)例轉(zhuǎn)換成dict的函數(shù)荷科,直接用__dict__屬性
print(json.dumps(s,default=lambda obj:obj.__dict__))

# JSON對象反序列化成實(shí)例
# 首先需要將json的dict類型轉(zhuǎn)換為對象類型
def dict2student(dicType):
    return Student(dicType['name'], dicType['age'], dicType['score']) 
# 這里d[ ]表示從字典取值,剛開頭講過的知識不要忘記

json_str = '{"age": 20, "score": 88, "name": "Bob"}' # 注意json對象是str畏浆,不要漏寫''符號
print(json.loads(json_str,object_hook=dict2student))
# dict2student返回值為一個(gè)對象實(shí)例,這樣json.loads()解析時(shí)就不會(huì)使用默認(rèn)的dict類型解析
# 輸出結(jié)果為
<__main__.Student object at 0x0000022F3707D048>

# 如果dict類型中包含中文字符串煮剧,使用json.dumps(obj, ensure_ascii=False)進(jìn)行序列化将鸵,默認(rèn)ensure_ascii=True,不改成False不能正常顯示中文字符


Python異常處理

# 異常處理格式:
try:
    程序
except Exception as 異常名稱:
    異常處理部分

# 注意:try和except的縮進(jìn)是在對應(yīng)的同一層次

Python異常處理例子:

# 捕獲異常草娜,輸出異常并結(jié)束
try:
    for i in range(10):
        print(i)
        if(i==4):
            print(unknown)
except Exception as err:
    print(err)
# 捕獲異常痒筒,輸出異常并繼續(xù)下一次循環(huán)
for i in range(10):
    try:
        print(i)
        if(i==4):
            print(unknown)
    except Exception as err:
        print(err)

Python面向?qū)ο缶幊?/h1>
# Python中的類的概念和其他語言相比沒什么不同
# 比較特殊的是protected和private在Python中是沒有明確限制的
# 一個(gè)慣例是用單下劃線開頭的表示protected,用雙下劃線開頭的表示private

# Python中定義一個(gè)類
class class1:
        """Class A"""  # 類定義中緊跟著類名字下一行的字符串叫做docstring移袍,
                       # 可以寫一些用于描述類的介紹老充,如果有定義則通過“類名.__doc__”訪問
        print('class1')
    # 構(gòu)造函數(shù),用關(guān)鍵字“__init__”
    # 在實(shí)例化對象時(shí)觅够,構(gòu)造函數(shù)被自動(dòng)調(diào)用,一般用于初始化變量
    # self:在類中的方法喘先,第一個(gè)參數(shù)必須是self  
    def __init__(self,name,job):
        print('I am __init__ in class1')
        print('My name is '+ name+' My job is '+job)
        # 定義屬性窘拯,一定要用self.屬性名
        self.myname=name
        self.myjob=job

        # 定義類中的方法:
    def myfunc(self,funcName):
        print('I an in class1.myfunc')
        print(funcName)

# 在實(shí)例化類時(shí)傳入?yún)?shù)給構(gòu)造函數(shù)
a=class1("keloli","student")
print(a.myname)
a.myfunc("func1")

# 輸出
class1
I am __init__ in class1
My name is keloli My job is student
keloli
I an in class1.myfunc
func1

# 類的繼承與重載
# 繼承:把某一個(gè)或多個(gè)類(基類)的特征拿過來
# 重載:在子類(派生類)中多繼承來的特征重新定義

# 單繼承:父親可以說話,小兒子繼承了父親涤姊,但是減弱了父親的說話能力
# 父親類(基類)
class father():
    def speak(self):
        print("father speak")
# 大兒子類(單繼承父親類)
class son1(father):
    pass

s1=son1()
s1.speak()

# 多繼承:父親可以說話,母親可以寫字奔誓,
# 女兒繼承了父親和母親搔涝,還可以聽
# 母親類(基類)
class mother():
    def write(self):
        print('mother write')

# 女兒類(多繼承父親和母親)
class daughter(father,mother):
    def listen(self):
        print('daughter listen')

dau=daughter()
dau.speak()
dau.write()
dau.listen()

# 重載
# 小兒子類重載父親類,減弱了父親的說話能力
class son2(father):
    def speak(self):
        print('son2 speak')

s2=son2()
s2.speak()

# 輸出
father speak
father speak
mother write
daughter listen
son2 speak

map, reduce和filter(函數(shù)式編程)

# map可以用于對可遍歷結(jié)構(gòu)的每個(gè)元素執(zhí)行同樣的操作蜕煌,批量操作:
map(lambda x: x**2, [1, 2, 3, 4])                 # [1, 4, 9, 16]
map(lambda x, y: x + y, [1, 2, 3], [5, 6, 7])     # [6, 8, 10]
  
# 在Python3種輸出上述結(jié)果
result1=list(map(lambda x: x**2, [1, 2, 3, 4]) )                # [1, 4, 9, 16]
print(result1)
result2(map(lambda x, y: x + y, [1, 2, 3], [5, 6, 7]))     # [6, 8, 10]
print(result2)

# reduce則是對可遍歷結(jié)構(gòu)的元素按順序進(jìn)行兩個(gè)輸入?yún)?shù)的操作
# 并且每次的結(jié)果保存作為下次操作的第一個(gè)輸入?yún)?shù)诬留,還沒有遍歷的元素作為第二個(gè)輸入?yún)?shù)
# 這樣的結(jié)果就是把一串可遍歷的值文兑,減少(reduce)成一個(gè)對象
from functools import reduce
res=reduce(lambda x, y: x + y, [1, 2, 3, 4])    # ((1+2)+3)+4=10
print(res)

# filter顧名思義盒刚,根據(jù)條件對可遍歷結(jié)構(gòu)進(jìn)行篩選
filter(lambda x: x % 2, [1, 2, 3, 4, 5])    # 篩選奇數(shù)因块,[1, 3, 5]

列表生成

# For More :http://www.codebelief.com/article/2017/02/python-advanced-programming-list-comprehensions/
# 列表生成可以非常方便地用來生成列表和迭代器
# 比如上節(jié)中map的兩個(gè)例子和filter的一個(gè)例子可以用列表生成重寫為
[x**2 for x in [1, 2, 3, 4]]                      # [1, 4, 9 16]

[sum(x) for x in zip([1, 2, 3], [5, 6, 7])]       # [6, 8, 10]
# zip()函數(shù)可以把多個(gè)列表關(guān)聯(lián)起來籍铁,這個(gè)例子中,通過zip()可以按順序同時(shí)輸出兩個(gè)列表對應(yīng)位置的元素對
# 有一點(diǎn)需要注意的是吩愧,zip()不會(huì)自動(dòng)幫助判斷兩個(gè)列表是否長度一樣增显,所以最終的結(jié)果會(huì)以短的列表為準(zhǔn)
# 想要以長的列表為準(zhǔn)的話可以考慮itertools模塊中的izip_longest()

[x for x in [1, 2, 3, 4, 5] if x % 2]             # [1, 3, 5]


# 如果要生成迭代器只需要把方括號換成括號,生成字典也非常容易:
iter_odd = (x for x in [1, 2, 3, 4, 5] if x % 2)

print(type(iter_odd))                       # <type 'generator'>

square_dict = {x: x**2 for x in range(5)}   # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
至于列表生成和map/filter應(yīng)該優(yōu)先用哪種甘穿,這個(gè)問題很難回答梢杭,不過Python創(chuàng)始人Guido似乎不喜歡map/filter/reduce,他曾在表示過一些從函數(shù)式編程里拿來的特性是個(gè)錯(cuò)誤武契。

Python 多線程

# 進(jìn)程由一個(gè)或多個(gè)線程組成咒唆,在單核CPU中采用各個(gè)任務(wù)交替執(zhí)行的方法達(dá)到任務(wù)并行處理的效果
# 多進(jìn)程和多線程的程序涉及到同步、數(shù)據(jù)共享的問題全释,編寫起來更復(fù)雜
# 廖雪峰老師這個(gè)章節(jié)講解比較詳細(xì)

from multiprocessing import Process
import os

# 子進(jìn)程要執(zhí)行的代碼
def run_proc(name):
    print('Run child process %s (%s)...' % (name, os.getpid()))

if __name__=='__main__':
    print('Parent process %s.' % os.getpid())
    p = Process(target=run_proc, args=('test',))
    print('Child process will start.')
    p.start()
    p.join()
    print('Child process end.')





Python OS模塊

# OS模塊常用函數(shù)
import os

abspath=os.path.abspath('') # 顯示當(dāng)前目錄的絕對路徑
print('abspath: ',abspath)

FileName1=os.path.basename(__file__) # 獲取當(dāng)前代碼所在文件的文件名,包含后綴
FileName2=FileName1.split('.')[-2] # 獲取當(dāng)前代碼所在文件的文件名妄迁,通過'.'分割字符串李命,[-1]是文件后綴,[-2]是文件名

newpath=os.path.join(abspath,'mkdir_test') # 在某目錄下創(chuàng)建新目錄黔州,先將新路徑表示出來
                                           # 把兩個(gè)路徑合成一個(gè)時(shí)阔籽,不要直接拼字符串,而要通過os.path.join()函數(shù)
                                           # 這樣可以正確處理不同操作系統(tǒng)的路徑分隔符
print('newpath: ',newpath)

try: # 與文件相關(guān)操作可能會(huì)出現(xiàn)路徑錯(cuò)誤等異常合冀,所以使用'try-except'語句對
    os.mkdir(newpath) # 創(chuàng)建目錄
except Exception as err: 
    print(err) 

try:
    DelatePath='D:\\Code_hub\\test\\16\\aa'
    os.rmdir(DelatePath) # 刪除目錄
    print('Delate:',DelatePath,'success!') 
except Exception as err:
    print(err)

FilePath='D:\\Code_hub\\test\\16\\text.py'
SplitPath=os.path.split(FilePath) # 一個(gè)路徑拆分為兩部分项贺,后一部分總是最后級別的目錄或文件名
print(SplitPath)

SplitextPath=os.path.splitext(FilePath) # 得到文件擴(kuò)展名
print(SplitextPath)
# print(type(SplitextPath))
print(SplitextPath[0])
print(SplitextPath[1]) # 建議使用print(SplitextPath[-1])如果你要獲取文件拓展名

# 注意:OS模塊不提供復(fù)制文件的函數(shù),原因是復(fù)制文件并非由操作系統(tǒng)提供的系統(tǒng)調(diào)用
# shutil模塊提供了copyfile()的函數(shù)
# 你還可以在shutil模塊中找到很多實(shí)用函數(shù)棕叫,它們可以看做是os模塊的補(bǔ)充

# 列出當(dāng)前目錄下的所有目錄及文件
FatherPath='D:\\Code_hub\\test'
for x in os.listdir(FatherPath):
    print(x)

# 列出當(dāng)前目錄下的所有目錄及文件
for x in os.listdir('.'):
    print(x)

# 列出所有.py文件
for x in os.listdir('.'):
    if os.path.isfile(x) and os.path.splitext(x)[-1]=='.py':
        print(x)

參考資料:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市伏钠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缎浇,老刑警劉巖赴肚,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異指厌,居然都是意外死亡踊跟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門箕憾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來决帖,“玉大人,你說我怎么就攤上這事扁远】滔瘢” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵谷羞,是天一觀的道長溜徙。 經(jīng)常有香客問我,道長蠢壹,這世上最難降的妖魔是什么图贸? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任冕广,我火速辦了婚禮偿洁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘睬辐。我一直安慰自己何吝,他們只是感情好鹃唯,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著黔酥,像睡著了一般洪橘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上熄求,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天弟晚,我揣著相機(jī)與錄音,去河邊找鬼卿城。 笑死,一個(gè)胖子當(dāng)著我的面吹牛搀捷,可吹牛的內(nèi)容都是我干的多望。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼家厌,長吁一口氣:“原來是場噩夢啊……” “哼枢纠!你這毒婦竟也來了黎棠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤镰绎,失蹤者是張志新(化名)和其女友劉穎脓斩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畴栖,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡随静,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吗讶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片燎猛。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖照皆,靈堂內(nèi)的尸體忽然破棺而出重绷,到底是詐尸還是另有隱情,我是刑警寧澤膜毁,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布昭卓,位于F島的核電站瘟滨,受9級特大地震影響候醒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜杂瘸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一倒淫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧败玉,春花似錦敌土、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至南蹂,卻和暖如春犬金,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背六剥。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工晚顷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疗疟。 一個(gè)月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓该默,卻偏偏與公主長得像,于是被迫代替她去往敵國和親策彤。 傳聞我的和親對象是個(gè)殘疾皇子栓袖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容