此篇只針對(duì)有編程基礎(chǔ)的同學(xué)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# python 3.x 學(xué)習(xí)筆記
# 其中一些函數(shù)與JavaScript進(jìn)行了對(duì)比
# pyhon 與 JavaScript 都是 動(dòng)態(tài)語(yǔ)言, 所以變量類型可以相互轉(zhuǎn)換
# python 部分內(nèi)置屬性是大寫開(kāi)頭的, 應(yīng)當(dāng)注意, 如 False, True, None
# Python的整數(shù)沒(méi)有大小限制误堡,而某些語(yǔ)言的整數(shù)根據(jù)其存儲(chǔ)長(zhǎng)度是有大小限制的,例如Java對(duì)32位整數(shù)的范圍限制在-2147483648-2147483647
# python 中 沒(méi)有;
# 不要對(duì)小數(shù)做 ^ 運(yùn)算, 會(huì)報(bào)錯(cuò)
# 廖雪峰的官方網(wǎng)站: https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
# 菜鳥(niǎo)教程: http://www.runoob.com/python/python-tutorial.html
# 打印文本, 相當(dāng)于 console.log
print('hello world')
print('hello', 'world')
# 定義變量, 相當(dāng)于 var, python沒(méi)有常量
name = 'mtshen'
PI = 3.1415926
print('name:', name, '\r\n', 'PI:', PI)
# && 運(yùn)算
f1 = True and True
print('f1:', f1)
# || 運(yùn)算
f2 = True or False
print('f2:', f2)
# ! 運(yùn)算
f3 = not False
print('f3:', f3)
# 求余
f4 = 10 % 3
print('f4:', f4)
# 地板求值, 值始終是整數(shù)
f5 = 10 // 3
print('f5:', f5)
# 定義長(zhǎng)文本
f6 = '''hello world
hello world
hello world'''
print('f6:', f6)
# 文本轉(zhuǎn)義\
f7 = 'I\'m mtshen!'
print('f7:', f7)
# 定義非轉(zhuǎn)義文本(內(nèi)容全部不轉(zhuǎn)義)
f8 = r"I'm mtshen"
print('f8:', f8)
# 等待用戶輸入
# 注意, 這是阻斷性的, 用戶沒(méi)有輸入完成后面的程序不會(huì)繼續(xù)執(zhí)行
f9 = input()
print('f9:', f9)
# 格式化字符串 % 運(yùn)算符
# %s表示用字符串替換
# %d表示用整數(shù)替換
# %f表示用浮點(diǎn)數(shù)替換
# %x表示用十六進(jìn)制整數(shù)替換
# 如果只有一個(gè)%?雏吭,括號(hào)可以省略
f10 = 'hello, %s' % 'world'
f11 = 'hello %s, %d, %f, %x' % ('world', 100, 100, 100)
print('f10:', f10, '\r\n', 'f11', f11)
# 字符串編碼 類似于 String.charCodeAt
f12 = ord('A')
print('f12:', f12)
# 字符串解碼 類似于 String.fromCharCode
f13 = chr(97)
print('f13:', f13)
# 定義bytes字符串
f14 = b'\xe4\xbd\xa0\xe5\xa5\xbd \xe4\xb8\x96\xe7\x95\x8c'
print('f14:', f14)
# 編碼成為bytes字符串
f15 = '你好 世界'.encode('utf-8')
print('f15:', f15)
# 解碼bytes字符串
f16 = b'\xe4\xbd\xa0\xe5\xa5\xbd \xe4\xb8\x96\xe7\x95\x8c'.decode('utf-8')
print('f16:', f16)
# 解碼bytes 兼容處理
f17 = b'\xe4\xbd\xa0\xe5\xa5\xbd\xe4'.decode('utf-8', errors='ignore')
print('f17:', f17)
# 計(jì)算字符長(zhǎng)度
f18 = len('hello world')
f19 = len(b'\xe4\xbd\xa0\xe5\xa5\xbd \xe4\xb8\x96\xe7\x95\x8c')
print('f18:', f18, '\r\n', 'f19:', f19)
# ========================================
# 列表 List 相當(dāng)于 Array
l1 = ['hello', 'world']
print('l1:', l1)
# 列表長(zhǎng)度
l2 = len(['hello', 'world'])
print('l2:', l2)
# 列表倒獲取-1就是倒數(shù)第一位, 依次類推
l3 = [0, 1, 2, 3, 4, 5][-1]
print('l3:', l3)
# 末尾追加, 相當(dāng)于push
l4 = [0, 1, 2, 3, 4]
l4.append(5)
print('l4:', l4)
# 插入任意位置
l5 = [0, 1, 2, 3, 4]
l5.insert(2, '5')
print('l5:', l5)
# 刪除尾元素 pop, 如果傳入值則刪除指定的位置
l6 = [0, 1, 2, 3, 4, 5]
l6.pop(1)
print('l6:', l6)
# 元組 Tuple 相當(dāng)于 new Array(X), 他的長(zhǎng)度是不可變化的
t1 = ('hello', 'world')
print('t1:', t1)
# 打印某一位, 與list一致
t2 = ('hello', 'world')[0]
print('t2:', t2)
# 判斷
a1 = 100
if a1 > 50:
print('a1: a1 > 50')
# else
a2 = 40
if a1 > 50:
print('a2: a2 > 50')
else:
print('a2: a2 < 50')
# elif
a3 = 50
if a3 > 50:
print('a3: a3 > 50')
elif a3 == 50:
print('a3: a3 = 50')
else:
print('a3: a3 < 50')
# 轉(zhuǎn)換字符串為整數(shù) int
a4 = int('100')
print(a4)
# 練習(xí)
# 請(qǐng)根據(jù)BMI公式(體重除以身高的平方)計(jì)算BMI指數(shù)锁施,并根據(jù)BMI指數(shù):
# 體質(zhì)指數(shù)(BMI)= 體重(kg) ÷ 身高^(guò)2(m)
# 低于18.5:過(guò)輕
# 18.5-25:正常
# 25-28:過(guò)重
# 28-32:肥胖
# 高于32:嚴(yán)重肥胖
print('練習(xí)1: BMI')
weight = float(input('weight(kg): '))
height = float(input('height(m): '))
bim = weight / (height * height)
print('你的BIM指數(shù)為: %s' % bim)
if bim < 18.5:
print('你的體重過(guò)輕了')
elif bim < 25:
print('你的體重正常')
elif bim < 28:
print('你的體重過(guò)重了')
elif bim < 32:
print('你的體重過(guò)于肥胖')
else:
print('你的體重嚴(yán)重肥胖')
# ======================================
# 循環(huán)
# for...in...
x1 = [1, 2, 3, 4, 5]
for x in x1:
print('x1 循環(huán):', x)
# while
x2 = 0
while x2 > 10:
x2 = x2 + 1
print('x2 循環(huán):', x2)
# 生成整數(shù)序列
x3 = range(5)
print('x3:', x3)
# 轉(zhuǎn)換成list
x4 = list(range(5))
print('x4:', x4)
# break結(jié)束循環(huán)
x5 = list(range(100))
for x in x5:
if x == 10:
break
else:
print('x5 循環(huán):', x)
# 跳出某一次循環(huán) continue
x6 = list(range(10))
for x in x6:
if x == 6:
continue
else:
print('x6 循環(huán):', x)
# Dict字典,類似Object
# key 必須加引號(hào), 不能使用.運(yùn)算符, 如果沒(méi)有符合的key會(huì)報(bào)錯(cuò)
d1 = { 'name': 'mtshen' }
print('d1:', d1)
print('d1 name:', d1['name'])
# 判斷key是否存在
d2 = 'name' in { 'name': 'mtshen' }
print('d2:', d2)
# 使用get獲取對(duì)用value, 如果不存在不會(huì)報(bào)錯(cuò)會(huì)返回None或自己預(yù)定的字符
d3 = {'name': 'mtshen'}.get('data')
d4 = {'name': 'mtshen'}.get('data', 'hello world')
print('d3:', d3, '\r\n', 'd4:', d4)
# 刪除某個(gè)key
d5 = {'name': 'mtshen', 'data': 'hello world'}
d5.pop('data')
print('d5:', d5)
# Set 鍵不可重復(fù)
s1 = set([1, 1, 2, 2, 3, 3]) # {1, 2, 3}
print('s1:', s1)
# 添加鍵
s2 = set([1, 2, 3])
s2.add(4) # {1, 2, 3, 4}
print('s2:', s2)
# 刪除鍵
s3 = set([1, 2, 3, 4, 5])
s3.remove(4) # {1, 2, 3, 5}
print('s3:', s3)
# =====================================================
# 函數(shù)
# 一些常用函數(shù)與JavaScript函數(shù)差不多, 如
# abs(): Math.abs(), max(): Math.max(), min(): Math.min()
# int(): Number.parseInt(), float(): Number.parseFloat(), bool(): Boolean()
# 定義函數(shù) def
def fn1(x):
print('fn1:', x)
fn1('hello world')
# 定義空函數(shù)
def fn2():
pass
fn2()
# 類型檢查 isinstance
type1 = isinstance(1, int)
print('type1', type1)
# 多類型檢查
type2 = isinstance(1, (int, float))
print('type2', type2)
# 主動(dòng)拋出類型錯(cuò)誤
# 幾種錯(cuò)誤類型
# TypeError 類型錯(cuò)誤
# SyntaxError 語(yǔ)法錯(cuò)誤
# IndexError 索引錯(cuò)誤
# AttributeError 屬性錯(cuò)誤
# KeyError 關(guān)鍵字錯(cuò)誤
# ValueError 可能為字符串字串錯(cuò)誤
# IndentationError 縮進(jìn)錯(cuò)誤
# 更多詳見(jiàn) https://blog.csdn.net/Karen_Yu_/article/details/78629918
# raise TypeError('type error!') # 報(bào)錯(cuò)會(huì)阻斷程序運(yùn)行, 解注釋可執(zhí)行
# 返回值 return
def fn3():
return 'hello world'
print('fn3:', fn3())
# 多返回值
def fn4():
return 100, 500 # 相當(dāng)于返回了一個(gè)tuple元素(100, 500), 返回值可省略括號(hào)
fnr1, fnr2 = fn4() # 接收返回值
print('fn4:', fnr1, fnr2)
# 預(yù)設(shè)默認(rèn)值, 設(shè)置預(yù)設(shè)值后執(zhí)行函數(shù), 可以不傳入指定參數(shù)
# !! python 中不要對(duì)預(yù)設(shè)的List, Dict, Set等可變類型值直接進(jìn)行修改
# 因?yàn)槟J(rèn)參數(shù)共同指向了同一個(gè)不變對(duì)象 !U让恰悉抵!
def fn5(name = 'mtshen'):
print('fn5:', name)
fn5()
# 不限定長(zhǎng)度函數(shù), 參數(shù)加*
# * 相當(dāng)于 函數(shù)中的參數(shù)解構(gòu)
def fn6(*angs):
print('f6:', angs)
fn6(1, 2, 3, 4, 5)
# 部分參數(shù)解構(gòu), 如果只有部分參數(shù)進(jìn)行解構(gòu), 意味著必須傳入?yún)?shù)名, 以 key = value 的形式傳入
def fn8(name, value, **data):
print('fn8:', name, value, data)
fn8('mtshen', 21, a = 5, b = 6, c = 7)
# 利用 * 對(duì)傳入?yún)?shù)解構(gòu)
def fn7(name, value):
print('f7:', name, value)
fn7(*['mtshen', 'hello world'])
# 關(guān)鍵字命名, 限定傳入的參數(shù)名, 必須以 key = value 的形式傳入, 這種方式傳入, 不限定傳入順序
# * 后的參數(shù)必須以 key = value 的形式傳入
def fn9(*, name, age):
print('fn9:', name, age)
fn9(age = 21, name = 'mtshen')
# 如果參數(shù)中存在 *key 那么等同于 *, 后面的參數(shù)必須以 key = value 的形式傳入
def fn10(name, *agrs, age):
print('fn10:', name, agrs, age)
fn10('mtshen', 1, 2, 3, 4, 5, age = 21)
# 參數(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ù)岂座。
# 如
def fn11(name, age = 21, *agrs, **kw):
pass
# ===================================================
# python 特性
# 切片, list切片即獲取某一區(qū)間的數(shù)組內(nèi)容
# 可以使用[min:max], [:max], [min:] 也可以輸入負(fù)值, 表述倒數(shù)位置
# 切片同樣適用于字符串, list, 元組, 字典, set
qp1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 10][1:4] # 1 - 4 但不包含 4,
print('qp1:', qp1)
# 利用切片淺拷貝
qp2 = qp1[:]
print('qp2:', qp2)
# 利用切片間隔取值
qp3 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10][::2] # 每間隔 2 個(gè)便取值
print('qp3:', qp3)
# 切片間隔取值2
qp4 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10][:5:2] #下標(biāo)為5 之前每間隔 2 個(gè)取值
print('qp4:', qp4)
# 迭代
# 迭代中使用下標(biāo) enumerate 可以將 ['name'] 轉(zhuǎn)換成 [(0, 'name')]
dd1 = ['name', 'age', 'data', 'value']
for index, data in enumerate(dd1):
print('dd1:', index, data)
# 列表生成器
# 如果要生成 1, 2, 3, 4, 5 可以使用
list1 = [x for x in range(1, 6)]
print('list1:', list1)
# 列表生成器基本結(jié)構(gòu)是
# [結(jié)果表達(dá)式 for...in...{1,} if{0,}]
# 如
list2 = ['value:' + str(value) for value in range(1, 11) if value > 5 ]
print('list2:', list2)
# 列表生成器中 for in 和 if 可以寫多個(gè), 進(jìn)行迭代
# 有木有很唬人, 其實(shí)原理很簡(jiǎn)單
list3 = [(x, y) for x in range(1, 10) for y in range(1, 10) if x > 5 if y > 5]
print('list3:', list3)
# 生成器
# 生成器的目的在于計(jì)算一組有規(guī)律的列表內(nèi)容, 在大量?jī)?nèi)容的情況下, 能夠減少內(nèi)存的占用
# 寫法與列表生成器一致, 只不過(guò) [] 變成 ()
sc1 = (x * 6 for x in range(999999999)) # 生成 999999999 個(gè)數(shù)據(jù)
print('sc1:', sc1)
# 生成器可以用for in 遍歷外, 還可以使用next來(lái)取得下一個(gè)生成內(nèi)容
sc2 = next(sc1)
print('sc2:', sc2)
# yield 關(guān)鍵字創(chuàng)建生成器
#當(dāng)使用 yield 時(shí), 你的函數(shù)將變成生成器 generator, 每次next, 會(huì)執(zhí)行到下一個(gè) yield
def yieldfn():
yield 1
yield 3
yield 5
yield 7
yieldfn0 = yieldfn()
yieldfn1 = next(yieldfn0)
yieldfn2 = next(yieldfn0)
yieldfn3 = next(yieldfn0)
yieldfn4 = next(yieldfn0)
print('yieldfn:', yieldfn)
print('yieldfn next:', yieldfn1)
print('yieldfn next:', yieldfn2)
print('yieldfn next:', yieldfn3)
print('yieldfn next:', yieldfn4)
# 迭代器
# 判斷屬性是否可以迭代, 前提是要引入 Iterable
# from collections import Iterable
# isinstance([], Iterable)
# 字符轉(zhuǎn)迭代
# isinstance(iter('hello world'), Iterable)