1.數(shù)據(jù)類型和變量
# coding=utf-8
"""
數(shù)據(jù)類型:整數(shù)睁本、浮點(diǎn)數(shù)踩蔚、字符串、布爾值(True,False)右钾、空值
變量(大小寫英文、數(shù)字和_的組合科吭,且不能用數(shù)字開頭)
常量(不能變d變量奖慌,字母全部大寫)
"""
a = 10 # a是整數(shù)
b = 1.11 # b是浮點(diǎn)數(shù)
c = "I\'m \"OK\"!\n" # c和d是字符串
d = 'I\'m learning\tPython.\n'
e = True # e為布爾型
f = None # f為空值
print(a, b, c, d, e, f)
s = a
a = 11
print(a, s)
PI = 301415926
# 精確除
print(10 / 3)
# 取整
print(10 // 3)
# 取余
print(10 % 3)
Snip20170913_2.png
2.字符串和編碼
"""
字符編碼:ASCII編碼驮俗、Unicode、UTF-8
ASCII編碼:占用一個(gè)字節(jié)侣集,表示大小寫英文字母键俱、數(shù)字和一些符號(hào)
Unicode編碼:通常占用兩個(gè)字節(jié),把所有語言都統(tǒng)一到一套編碼里
UTF-8:可變長編碼世分,節(jié)省空間编振,常用的英文字母被編碼成1個(gè)字節(jié),漢字通常是3個(gè)字節(jié)
格式化字符串:%d(整數(shù))臭埋、%f(浮點(diǎn)數(shù))踪央、%s(字符串)、%x(十六進(jìn)制整數(shù))
"""
# 獲取字符的整數(shù)表示:
print(ord('A'))
print(ord('中'))
# 把編碼轉(zhuǎn)換為對(duì)應(yīng)的字符:
print(chr(65))
print(chr(25444))
# str變?yōu)閎ytes 用encode()方法
print('中文'.encode('utf-8'))
print('abc'.encode('ascii'))
# bytes變?yōu)閟tr 用decode()方法
print(b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8'))
print(b'abc'.decode('ascii'))
# 計(jì)算str有幾個(gè)字符 用len()
print(len('acvv'))
print(len('哈哈好啊好啊'))
# 格式化字符串
print('%d-%.2f' % (4, 44.321))
print('age: %d. gender: %s' % (11, "hh"))
Snip20170913_3.png
3.list和tuple
"""
list和tuple
共同點(diǎn):有序集合斋泄,元素的數(shù)據(jù)類型可以不同
不同點(diǎn):
list:可隨時(shí)添加和刪除其中的元素
tuple:一旦初始化就不能修改
"""
# list
classmates = ['michael', 'bob', 'tracy']
# 獲取list元素個(gè)數(shù)
print(len(classmates))
# 用索引來訪問list元素
print(classmates[0])
print(classmates[2])
print(classmates[-1]) # 倒數(shù)第一個(gè)
print(classmates[-2]) # 倒數(shù)第二個(gè)
# 追加元素到末尾
classmates.append('adam')
print(classmates)
# 插入到指定位置
classmates.insert(2, 'jack')
print(classmates)
# 刪除list末尾的元素
classmates.pop()
print(classmates)
# 刪除指定位置元素
classmates.pop(1)
print(classmates)
# 根據(jù)索引修改元素
classmates[1] = 'sarah'
print(classmates)
# tuple
cla = ('mm', 'ss', 'cc')
print(cla[2])
Snip20170913_4.png
4.條件判斷
"""
條件判斷
if <條件判斷1>:
<執(zhí)行1>
elif <條件判斷2>:
<執(zhí)行2>
elif <條件判斷3>:
<執(zhí)行3>
else:
<執(zhí)行4>
"""
age = 3
if age >= 18:
print('adult')
elif age >= 6:
print('teenager')
else:
print('kid')
5.循環(huán)
"""
循環(huán)
1.for...in
2.while
break和continue
"""
names = ['mm', 'ss', 'cc']
for name in names:
print(name)
s = 0
for x in range(10):
s = s + x
print(s)
sm = 0
n = 10
while n > 0:
sm = sm + n
n = n - 1
print(sm)
# break:退出當(dāng)前循環(huán)
n = 1
while n <= 20:
if n > 5:
break
print(n)
n = n + 1
print('END')
# continue:跳出當(dāng)前的這一次循環(huán)杯瞻,繼續(xù)開始下一次循環(huán)
n = 0
while n < 10:
n = n + 1
if n % 2 == 0:
continue
print(n)
Snip20170913_5.png
6.dict和set
"""
dict:使用key-value存儲(chǔ)
set:一組key的集合,無重復(fù)元素
"""
# dict
d = {'mm': 55, 'ss': 44, 'll': 33}
print(d)
# 取出某個(gè)key對(duì)應(yīng)的value
print(d['mm'])
print(d.get('mm'))
# 添加
d['aa'] = 99
print(d)
# 修改某個(gè)key對(duì)應(yīng)的value
d['aa'] = 88
print(d)
# 刪除一個(gè)key
d.pop('aa')
print(d)
# set
s = set([1, 2, 3])
print(s)
s = set([1, 2, 2, 4, 4])
print(s)
# 添加
s.add(3)
print(s)
s.add(4)
print(s)
# 刪除
s.remove(4)
print(s)
s1 = set([1, 2, 3])
s2 = set([2, 3, 4])
print(s1 & s2) # 交集
print(s1 | s2) # 并集
Snip20170913_6.png
7.函數(shù)
"""
函數(shù)
定義函數(shù):def 函數(shù)名(參數(shù)): return語句
函數(shù)的參數(shù):
1.位置參數(shù)
2.默認(rèn)參數(shù)
3.可變參數(shù):允許你傳入0個(gè)或任意個(gè)參數(shù)炫掐,這些可變參數(shù)在函數(shù)調(diào)用時(shí)自動(dòng)組裝為一個(gè)tuple
4.關(guān)鍵字參數(shù):關(guān)鍵字參數(shù)允許你傳入0個(gè)或任意個(gè)含參數(shù)名的參數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動(dòng)組裝為一個(gè)dict
5.命名關(guān)鍵字參數(shù):要限制關(guān)鍵字參數(shù)的名字,命名關(guān)鍵字參數(shù)需要一個(gè)特殊分隔符*睬涧,*后面的參數(shù)被視為命名關(guān)鍵字參數(shù)
在Python中定義函數(shù)募胃,可以用必選參數(shù)、默認(rèn)參數(shù)畦浓、可變參數(shù)痹束、關(guān)鍵字參數(shù)和命名關(guān)鍵字參數(shù),這5種參數(shù)都可以組合使用讶请。
但是請(qǐng)注意祷嘶,參數(shù)定義的順序必須是:必選參數(shù)、默認(rèn)參數(shù)夺溢、可變參數(shù)论巍、命名關(guān)鍵字參數(shù)和關(guān)鍵字參數(shù)。
"""
import math
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
print('--------------------')
print(my_abs(-4))
def move(x, y, step, angle=0): # angle是默認(rèn)參數(shù)
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny # 返回多個(gè)值
print('--------------------')
print(move(1, 2, 2))
print('--------------------')
print(move(1, 2, 2, 1)) # 默認(rèn)參數(shù)此時(shí)的值為1
# 可變參數(shù)
def calc(*numbers):
sm = 0
for n in numbers:
sm = sm + n * n
return sm
print('--------------------')
print(calc(1, 2, 3,))
nums = [1, 2, 3]
print('--------------------')
print(calc(*nums)) # *nums把nums這個(gè)list的所有元素作為可變參數(shù)傳進(jìn)去
# 關(guān)鍵字參數(shù)
def person(name, age, **kw):
print("name:", name, "age:", age)
for k in kw:
print(k, kw[k])
print('--------------------')
person('Adam', 45, gender='M', job='Engineer')
extra = {'city': 'Beijing', 'job': 'Engineer'}
print('--------------------')
person('Jack', 24, **extra) # **extra表示把extra這個(gè)dict的所有key-value用關(guān)鍵字參數(shù)傳入到函數(shù)的**kw參數(shù)
# 命名關(guān)鍵字參數(shù)
def person(name, age, *, city, job):
print(name, age, city, job)
print('--------------------')
person('Jack', 24, city='Beijing', job='Engineer')
# 組合參數(shù)
def f1(a, b, c=0, *args, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
print('--------------------')
f1(1, 2, 3, 'a', 'b', x=99)
"""
*args是可變參數(shù)风响,args接收的是一個(gè)tuple嘉汰;
**kw是關(guān)鍵字參數(shù),kw接收的是一個(gè)dict
"""
Snip20170914_7.png
8.切片
"""
切片
"""
L = list(range(100)) # 創(chuàng)建一個(gè)0-99的數(shù)列
print(L[:10]) # 取前10個(gè)
print(L[-10:]) # 取后10個(gè)
print(L[10:20]) # 取前11-20個(gè)數(shù)
print(L[:10:2]) # 取前10個(gè),每兩個(gè)取一個(gè)
print(L[::5]) # 所有數(shù)状勤,每5個(gè)取一個(gè)
Snip20170914_8.png
9.迭代
"""
迭代:for...in 遍歷list或tuple或dict
"""
d = {'a': 1, 'b': 2, 'c': 3}
# 迭代key
for key in d:
print(key)
print('-----------------')
# 迭代value
for value in d.values():
print(value)
print('-----------------')
# 同時(shí)迭代key和value
for k, v in d.items():
print(k, v)
print('-----------------')
# 如何判斷一個(gè)對(duì)象是可迭代對(duì)象呢鞋怀?
from collections import Iterable
print(isinstance('abc', Iterable)) # str是否可迭代
print(isinstance([1, 2, 3], Iterable)) # list是否可迭代
print(isinstance(123, Iterable)) # 整數(shù)是否可迭代
print('-----------------')
# enumerate函數(shù)可以把一個(gè)list變成索引-元素對(duì)
for i, value in enumerate(['A', 'B', 'C']):
print(i, value)
print('-----------------')
# 同時(shí)引用兩個(gè)變量
for x, y in [(1, 1), (2, 4), (3, 9)]:
print(x, y)
Snip20170914_9.png
10.列表生成式
"""
列表生成式(List Comprehensions)
"""
print(list(range(1, 11)))
print([x * x for x in range(1, 11)])
print([x * x for x in range(1, 11) if x % 2 == 0])
print([m + n for m in 'ABC' for n in 'XYZ'])
d = {'x': 'A', 'y': 'B', 'z': 'c'}
print([k + '=' + v for k, v in d.items()])
L = ['Hello', 'World', 'IBM', 'Apple']
print([s.lower() for s in L])
Snip20170914_10.png
11.生成器
"""
生成器(generator)
"""
g = (x * x for x in range(10))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print('----------')
l = (x * x for x in range(10))
for n in l:
print(n)
print('----------')
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
return 'done'
print(fib(6))
print('----------')
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
b = fib(6)
print(b) # b是一個(gè)generator
print('----------')
for n in fib(6):
print(n)
Snip20170914_12.png
12.迭代器
"""
迭代器(Iterator):可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象。它們表示一個(gè)惰性計(jì)算的序列
可以直接作用于for循環(huán)的對(duì)象統(tǒng)稱為可迭代對(duì)象:Iterable.包括:list持搜、tuple密似、dict、set葫盼、str残腌、generator
集合數(shù)據(jù)類型如list、dict、str等是Iterable但不是Iterator废累,不過可以通過iter()函數(shù)獲得一個(gè)Iterator對(duì)象
Python的for循環(huán)本質(zhì)上就是通過不斷調(diào)用next()函數(shù)實(shí)現(xiàn)的
"""
from collections import Iterable
from collections import Iterator
print(isinstance([], Iterable))
print(isinstance([], Iterator))
print('-------------')
print(isinstance({}, Iterable))
print(isinstance({}, Iterator))
print('-------------')
print(isinstance((x for x in range(10)), Iterable))
print(isinstance((x for x in range(10)), Iterator)) # 生成器都是Iterator對(duì)象
print('-------------')
# 把list邓梅、dict、str等Iterable變成Iterator可以使用iter()函數(shù):
print(isinstance(iter([]), Iterable))
print(isinstance(iter([]), Iterator))
Snip20170914_11.png
13.高階函數(shù)
from functools import reduce
"""
高階函數(shù)
map():map()函數(shù)接收兩個(gè)參數(shù)邑滨,一個(gè)是函數(shù)日缨,一個(gè)是Iterable,map將傳入的函數(shù)依次作用到序列的每個(gè)元素掖看,并把結(jié)果作為新的Iterator返回.
reduce():reduce把一個(gè)函數(shù)作用在一個(gè)序列上匣距,這個(gè)函數(shù)必須接收兩個(gè)參數(shù),reduce把結(jié)果繼續(xù)和序列的下一個(gè)元素做計(jì)算
filter():用于過濾序列,把傳入的函數(shù)依次作用于每個(gè)元素哎壳,然后根據(jù)返回值是True還是False決定保留還是丟棄該元素毅待。
sorted():排序,可以接收一個(gè)key函數(shù)來實(shí)現(xiàn)自定義的排序
"""
# map()
def f(x):
return x * x
r = map(f, [1, 2, 3, 4, 5, 6])
print(list(r)) # 結(jié)果r是一個(gè)Iterator归榕,Iterator是惰性序列尸红,因此通過list()函數(shù)讓它把整個(gè)序列都計(jì)算出來并返回一個(gè)list。
# 把list所有數(shù)字轉(zhuǎn)為字符串
print(list(map(str, [1, 2, 3, 4, 5, 6])))
# reduce()
def add(x, y):
return x + y
print(reduce(add, [1, 2, 3, 4, 5]))
def fn(x, y):
return x * 10 + y
print(reduce(fn, [1, 3, 5, 7, 9]))
# map()和redce()組合使用
def char2num(s):
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
print(reduce(lambda x, y: x * 10 + y, map(char2num, '13579')))
print('----------------')
# filter()返回的是一個(gè)Iterator刹泄,也就是一個(gè)惰性序列,用list()函數(shù)獲得所有結(jié)果并返回list
# 刪掉空字符串
def not_empty(s):
return s and s.strip()
print(list(filter(not_empty, ['A', '', 'B', None, 'C', ' '])))
# sorted()
print('----------------')
print(sorted([36, 5, -12, 9, -21]))
print(sorted([36, 5, -12, 9, -21], key=abs)) # 按絕對(duì)值大小排序
print(sorted(['bob', 'about', 'Zoo', 'Credit']))
print(sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)) # 按小寫排序
print(sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)) # 反向排序
Snip20170915_13.png
14.返回函數(shù)和匿名函數(shù)
"""
返回函數(shù)
匿名函數(shù):關(guān)鍵字lambda表示匿名函數(shù)外里,冒號(hào)前面的x表示函數(shù)參數(shù)。匿名函數(shù)只能有一個(gè)表達(dá)式特石,不用寫return盅蝗,返回值就是該表達(dá)式的結(jié)果。
"""
# 返回函數(shù)
def lazy_sum(*args):
def sm():
ax = 0
for n in args:
ax = ax + n
return ax
return sm
f = lazy_sum(1, 3, 5, 7, 9)
print(f()) # 調(diào)用函數(shù)f
# 匿名函數(shù)
ax = lambda x: x * x
print(ax(5))
def build(x, y):
return lambda: x * x + y * y # 把匿名函數(shù)作為返回值返回
print(build(2, 3)())
Snip20170915_14.png
15.裝飾器
"""
裝飾器:在代碼運(yùn)行期間動(dòng)態(tài)增加功能姆蘸,decorator就是一個(gè)返回函數(shù)的高階函數(shù)墩莫,
"""
def log(func):
def wrapper(*args, **kw):
print('call %s()' % func.__name__)
return func(*args, **kw)
return wrapper
@log
def now():
print('2017-07-07')
now()
Snip20170915_16.png