Python语法-1-变量、输出、List列表、tuple元组、条件判断和循环等重要基础知识
針對(duì)Openmv3上的Python應(yīng)用(摘錄帶修改)
輸出
1、
用print()在括號(hào)中加上字符串,就可以向屏幕上輸出指定的文字。比如輸出'hello, world',用代碼實(shí)現(xiàn)如下:
print('hello, world') hello, worldprint()函數(shù)也可以接受多個(gè)字符串,用逗號(hào)“,”隔開,就可以連成一串輸出:
print('The quick brown fox', 'jumps over', 'the lazy dog') The quick brown fox jumps over the lazy dogprint()會(huì)依次打印每個(gè)字符串,遇到逗號(hào)“,”會(huì)輸出一個(gè)空格,因此,輸出的字符串是這樣拼起來(lái)的:
The quick brown fox jumps over the lazy dogprint()也可以打印整數(shù),或者計(jì)算結(jié)果:
print(300) 300 print(100 + 200) 300因此,我們可以把計(jì)算100 + 200的結(jié)果打印得更漂亮一點(diǎn):
print('100 + 200 =', 100 + 200) 100 + 200 = 300注意,對(duì)于100 + 200,Python解釋器自動(dòng)計(jì)算出結(jié)果300,但是,'100 + 200 ='是字符串而非數(shù)學(xué)公式,Python把它視為字符串.
變量
在Python中,等號(hào)=是賦值語(yǔ)句,可以把任意數(shù)據(jù)類型賦值給變量,同一個(gè)變量可以反復(fù)賦值,而且可以是不同類型的變量,例如:
a = 123 # a是整數(shù)print(a)a = 'ABC' # a變?yōu)樽址?/span>print(a)這種變量本身類型不固定的語(yǔ)言稱之為動(dòng)態(tài)語(yǔ)言,與之對(duì)應(yīng)的是靜態(tài)語(yǔ)言。靜態(tài)語(yǔ)言在定義變量時(shí)必須指定變量類型,如果賦值的時(shí)候類型不匹配,就會(huì)報(bào)錯(cuò)。例如Java是靜態(tài)語(yǔ)言,賦值語(yǔ)句如下(// 表示注釋):
int a = 123; // a是整數(shù)類型變量 ,靜態(tài)語(yǔ)言a = "ABC"; // 錯(cuò)誤:不能把字符串賦給整型變量和靜態(tài)語(yǔ)言相比,動(dòng)態(tài)語(yǔ)言更靈活,就是這個(gè)原因。
List列表
Python內(nèi)置的一種數(shù)據(jù)類型是列表:list。list是一種有序的集合,可以隨時(shí)添加和刪除其中的元素。 比如,列出班里所有同學(xué)的名字,就可以用一個(gè)list表示:
classmates = ['Michael', 'Bob', 'Tracy']classmates ['Michael', 'Bob', 'Tracy']變量classmates就是一個(gè)list。用len()函數(shù)可以獲得list元素的個(gè)數(shù):
len(classmates) 3用索引來(lái)訪問list中每一個(gè)位置的元素,記得索引是從0開始的:
classmates[0] 'Michael' classmates[1] 'Bob' classmates[2] 'Tracy' classmates[3] Traceback (most recent call last):File "<stdin>", line 1, in <module> IndexError: list index out of range當(dāng)索引超出了范圍時(shí),Python會(huì)報(bào)一個(gè)IndexError錯(cuò)誤,所以,要確保索引不要越界,記得最后一個(gè)元素的索引是len(classmates) - 1。
如果要取最后一個(gè)元素,除了計(jì)算索引位置外,還可以用-1做索引,直接獲取最后一個(gè)元素:
classmates[-1] 'Tracy'以此類推,可以獲取倒數(shù)第2個(gè)、倒數(shù)第3個(gè):
classmates[-2] 'Bob' classmates[-3] 'Michael' classmates[-4] Traceback (most recent call last):File "<stdin>", line 1, in <module>IndexError: list index out of range當(dāng)然,倒數(shù)第4個(gè)就越界了。
list是一個(gè)可變的有序表,所以,可以往list中追加元素到末尾:
classmates.append('Adam')classmates ['Michael', 'Bob', 'Tracy', 'Adam']也可以把元素插入到指定的位置,比如索引號(hào)為1的位置:
classmates.insert(1, 'Jack')classmates ['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']要刪除list末尾的元素,用pop()方法:
classmates.pop() 'Adam' classmates ['Michael', 'Jack', 'Bob', 'Tracy']要把某個(gè)元素替換成別的元素,可以直接賦值給對(duì)應(yīng)的索引位置:
classmates[1] = 'Sarah' classmates['Michael', 'Sarah', 'Tracy']list里面的元素的數(shù)據(jù)類型也可以不同,比如:
L = ['Apple', 123, True]如果一個(gè)list中一個(gè)元素也沒有,就是一個(gè)空的list,它的長(zhǎng)度為0:
L = []len(L)0tuple元組
另一種有序列表叫元組:tuple。tuple和list非常類似,但是tuple一旦初始化就不能修改,比如同樣是列出同學(xué)的名字:
classmates = ('Michael', 'Bob', 'Tracy')現(xiàn)在,classmates這個(gè)tuple不能變了,它也沒有append(),insert()這樣的方法。其他獲取元素的方法和list是一樣的,你可以正常地使用classmates[0],classmates[-1],但不能賦值成另外的元素。
不可變的tuple有什么意義?因?yàn)閠uple不可變,所以代碼更安全。如果可能,能用tuple代替list就盡量用tuple。
tuple的陷阱:當(dāng)你定義一個(gè)tuple時(shí),在定義的時(shí)候,tuple的元素就必須被確定下來(lái),比如:
t = (1, 2)t(1, 2)但是,要定義一個(gè)只有1個(gè)元素的tuple,如果你這么定義:
t = (1)t1定義的不是tuple,t是整型變量,變量t的值為1!這是因?yàn)槔ㄌ?hào)()既可以表示tuple,又可以表示數(shù)學(xué)公式中的小括號(hào),這就產(chǎn)生了歧義,因此,Python規(guī)定,這種情況下,按小括號(hào)進(jìn)行計(jì)算,計(jì)算結(jié)果自然是1。
所以,只有1個(gè)元素的tuple定義時(shí)必須加一個(gè)逗號(hào),,來(lái)消除歧義:
t = (1,)t(1,)Python在顯示只有1個(gè)元素的tuple時(shí),也會(huì)加一個(gè)逗號(hào),,以免你誤解成數(shù)學(xué)計(jì)算意義上的括號(hào)。
條件判斷
if語(yǔ)句的完整形式是:
if <條件判斷1>:<執(zhí)行1> elif <條件判斷2>:<執(zhí)行2> elif <條件判斷3>:<執(zhí)行3> else:<執(zhí)行4>比如:
age = 20 if age >= 6:print('teenager') elif age >= 18:print('adult') else:print('kid')循環(huán)
Python的循環(huán)有兩種,一種是for...in循環(huán),依次把list或tuple中的每個(gè)元素迭代出來(lái),看例子:
names = ['Michael', 'Bob', 'Tracy'] for name in names:print(name)執(zhí)行這段代碼,會(huì)依次打印names的每一個(gè)元素:
MichaelBobTracy所以for x in ...循環(huán)就是把每個(gè)元素代入變量x,然后執(zhí)行縮進(jìn)塊的語(yǔ)句。
如果要計(jì)算1-100的整數(shù)之和,從1寫到100有點(diǎn)困難,幸好Python提供一個(gè)range()函數(shù),可以生成一個(gè)整數(shù)序列,再通過list()函數(shù)可以轉(zhuǎn)換為list。比如range(5)生成的序列是從0開始小于5的整數(shù):
list(range(5))[0, 1, 2, 3, 4]range(101)就可以生成0-100的整數(shù)序列,計(jì)算如下:
sum = 0 for x in range(101):sum = sum + x print(sum)第二種循環(huán)是while循環(huán),比如我們要計(jì)算100以內(nèi)所有奇數(shù)之和,可以用while循環(huán)實(shí)現(xiàn):
sum = 0 n = 99 while n > 0:sum = sum + nn = n - 2 print(sum)===== 數(shù)據(jù)類型轉(zhuǎn)換 =====
Python內(nèi)置的常用函數(shù)還包括數(shù)據(jù)類型轉(zhuǎn)換函數(shù),比如int()函數(shù)可以把其他數(shù)據(jù)類型轉(zhuǎn)換為整數(shù):
int('123') 123 int(12.34) 12 float('12.34') 12.34 str(1.23) '1.23' str(100) '100' bool(1) True bool('') False===== 函數(shù) =====
在Python中,定義一個(gè)函數(shù)要使用def語(yǔ)句,依次寫出函數(shù)名、括號(hào)、括號(hào)中的參數(shù)和冒號(hào):,然后,在縮進(jìn)塊中編寫函數(shù)體,函數(shù)的返回值用return語(yǔ)句返回。
我們先寫一個(gè)計(jì)算x2的函數(shù):
def power(x):return x * x對(duì)于power(x)函數(shù),參數(shù)x就是一個(gè)位置參數(shù)。
當(dāng)我們調(diào)用power函數(shù)時(shí),必須傳入有且僅有的一個(gè)參數(shù)x:
>>> power(5)25>>> power(15)225現(xiàn)在,如果我們要計(jì)算x3怎么辦?可以再定義一個(gè)power3函數(shù),但是如果要計(jì)算x4、x5……怎么辦?我們不可能定義無(wú)限多個(gè)函數(shù)。
你也許想到了,可以把power(x)修改為power(x, n),用來(lái)計(jì)算xn,說(shuō)干就干:
def power(x, n):s = 1while n > 0:n = n - 1s = s * xreturn s對(duì)于這個(gè)修改后的power(x, n)函數(shù),可以計(jì)算任意n次方:
>>> power(5, 2)25>>> power(5, 3)125修改后的power(x, n)函數(shù)有兩個(gè)參數(shù):x和n,這兩個(gè)參數(shù)都是位置參數(shù),調(diào)用函數(shù)時(shí),傳入的兩個(gè)值按照位置順序依次賦給參數(shù)x和n。
切片
取一個(gè)list或tuple的部分元素是非常常見的操作。比如,一個(gè)list如下:
>>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']取前3個(gè)元素,用一行代碼就可以完成切片:
>>> L[0:3]['Michael', 'Sarah', 'Tracy']L[0:3]表示,從索引0開始取,直到索引3為止,但不包括索引3。即索引0,1,2,正好是3個(gè)元素。
如果第一個(gè)索引是0,還可以省略:
>>> L[:3]['Michael', 'Sarah', 'Tracy']也可以從索引1開始,取出2個(gè)元素出來(lái):
>>> L[1:3]['Sarah', 'Tracy']tuple也是一種list,唯一區(qū)別是tuple不可變。因此,tuple也可以用切片操作,只是操作的結(jié)果仍是tuple:
>>> (0, 1, 2, 3, 4, 5)[:3](0, 1, 2)字符串'xxx'也可以看成是一種list,每個(gè)元素就是一個(gè)字符。因此,字符串也可以用切片操作,只是操作結(jié)果仍是字符串:
>>> 'ABCDEFG'[:3]'ABC'對(duì)象
Python是面向?qū)ο?/span>編程的,比如一個(gè)LED燈
from pyb import LEDred_led = LED(1) red_led.on()LED是一個(gè)類,red_led就是一個(gè)對(duì)象,可以對(duì)這個(gè)對(duì)象進(jìn)行操作,比如點(diǎn)亮on,關(guān)掉off,查看value。
模塊的使用
什么是模塊?
隨著代碼的增多,在一個(gè)文件里的代碼會(huì)越來(lái)越長(zhǎng),越來(lái)越難看懂。
為了編寫可維護(hù)的代碼,我們把很多函數(shù)分組,放到不同的文件里。在Python中,一個(gè).py文件就稱之為一個(gè)模塊(Module)。
模塊有什么好處?復(fù)用代碼方便!如果我寫了一個(gè)模塊,你也寫了一個(gè)模塊,我們就有了兩個(gè)模塊。我們把這些模塊都組織起來(lái),大家就可以少寫很多代碼了!
這個(gè)是OpenMV的模塊庫(kù),包含常見的模塊。?https://github.com/SingTown/OpenMV-lib
如何使用模塊?
import pybred_led = pyb.LED(1)red_led.on()import pyb就是引入pyb這個(gè)模塊。通過import語(yǔ)句,就可以引入模塊。
還有from xxx import ooo 的語(yǔ)句,意思是通過xxx模塊引入ooo類,或者通過xxx模塊引入ooo函數(shù)。比如上面的程序可以寫成:
from pyb import LEDred_led = LED(1)red_led.on()這就是通過pyb的模塊來(lái)引入LED類了。
如何添加自定義模塊?
之前我們提到了,OpenMV是有文件系統(tǒng)的。
文件系統(tǒng)的根目錄存在一個(gè)main.py,代碼執(zhí)行的當(dāng)前目錄就是根目錄。
所以我們把模塊的文件復(fù)制到OpenMV的“U盤”里就可以。如圖:
這里的pid.py只是舉一個(gè)舉例。
我把pid.py復(fù)制到了U盤的根目錄下。那么在程序中:
import pid就可以引入pid模塊了了。或者通過:
from pid import PID這就是引入了PID類。
總結(jié)
以上是生活随笔為你收集整理的Python语法-1-变量、输出、List列表、tuple元组、条件判断和循环等重要基础知识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 索尼rx1r人脸识别_一波三折的闲鱼翻车
- 下一篇: 聚合支付项目(一)