python基礎(chǔ)

此篇只針對(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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末态蒂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子费什,更是在濱河造成了極大的恐慌钾恢,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸳址,死亡現(xiàn)場(chǎng)離奇詭異瘩蚪,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)稿黍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門疹瘦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人巡球,你說(shuō)我怎么就攤上這事拱礁。” “怎么了辕漂?”我有些...
    開(kāi)封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吴超。 經(jīng)常有香客問(wèn)我钉嘹,道長(zhǎng),這世上最難降的妖魔是什么鲸阻? 我笑而不...
    開(kāi)封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任跋涣,我火速辦了婚禮,結(jié)果婚禮上鸟悴,老公的妹妹穿的比我還像新娘陈辱。我一直安慰自己,他們只是感情好细诸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布沛贪。 她就那樣靜靜地躺著,像睡著了一般震贵。 火紅的嫁衣襯著肌膚如雪利赋。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天猩系,我揣著相機(jī)與錄音媚送,去河邊找鬼。 笑死寇甸,一個(gè)胖子當(dāng)著我的面吹牛塘偎,可吹牛的內(nèi)容都是我干的疗涉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吟秩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咱扣!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起峰尝,我...
    開(kāi)封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤偏窝,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后武学,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體祭往,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年火窒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了硼补。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡熏矿,死狀恐怖已骇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情票编,我是刑警寧澤褪储,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站慧域,受9級(jí)特大地震影響鲤竹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昔榴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一辛藻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧互订,春花似錦吱肌、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至坟瓢,卻和暖如春勇边,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背折联。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工粒褒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人诚镰。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓奕坟,卻偏偏與公主長(zhǎng)得像祥款,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子月杉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353