變量:變量可不定義,但一定要有賦值。
一、python基礎
1、輸出和輸入
輸出
在print()中輸入字符串,就可以向屏幕上輸出相應的字符串,如'hello world';
print()也可以接受多個字符串,用逗號隔開,每個逗號代表一個空格:
print()也可以打印和計算數字:
輸入
Python3版本中input默認接收到的是str類型,如:
結果如下:
如果想要接收的是數值型,則需要用int來進行強制轉換:
結果:
2、數據類型與變量
整型、浮點型、字符串、布爾值、變量、常量
3、字符串格式化
python的格式化和C一樣。
%d | 整數 |
%f | 浮點數 |
%s | 字符串 |
%x | 十六進制整數 |
%d:普通的輸出
%2d:按寬度爲2輸出,右對齊,若寬度不夠2,則在左邊補空格
%02d:和%2d差不多,不過在左邊補0
%2d和%02d從執行效果來說,差不多。
有些時候,字符串裏面的%
是一個普通字符怎麼辦?這個時候就需要轉義,用%%
來表示一個%
:
>>> 'growth rate: %d %%' % 7
'growth rate: 7 %'
例子:
print('Hello,%s!'%x)
4、list和tuple
list:列表(可變長度,可隨時增加和減少元素,元素內容可修改),裏面的數據類型可以不相同,[]
tuple:元組(長度不可變),()
set:同數學上的集合一樣:不重複無序的元素,無索引。
5、條件判斷
if <條件判斷1>:
<執行1>
elif <條件判斷2>:
<執行2>
elif <條件判斷3>:
<執行3>
else:
<執行4>
6、循環
for ... in XXX(...取XXX的 )
range(a,b,c):可看爲以a爲首項,c爲公差,且不超過b-1的等差數列。
7、字典和集合
定義:字典是一種大小可變的鍵值對集,其中的鍵和值都是Python對象,又稱哈希映射。
方法:插入、in、del/pop、keys(獲得鍵的列表)、values(獲得值的列表)
PS:字典調用不能像列表元組那樣用調用切片,需調用keys值。
和list比較,dict有以下幾個特點:
- 查找和插入的速度極快,不會隨着key的增加而變慢;
- 需要佔用大量的內存,內存浪費多。
而list相反:
- 查找和插入的時間隨着元素的增加而增加;
- 佔用空間小,浪費內存很少。
所以,dict是用空間來換取時間的一種方法。
dict可以用在需要高速查找的很多地方,在Python代碼中幾乎無處不在,正確使用dict非常重要,需要牢記的第一條就是dict的key必須是不可變對象。
這是因爲dict根據key來計算value的存儲位置,如果每次計算相同的key得出的結果不同,那dict內部就完全混亂了。這個通過key計算位置的算法稱爲哈希算法(Hash)。
要保證hash的正確性,作爲key的對象就不能變。在Python中,字符串、整數等都是不可變的,因此,可以放心地作爲key。而list是可變的,就不能作爲key:
set和dict的唯一區別僅在於沒有存儲對應的value,但是,set的原理和dict一樣,所以,同樣不可以放入可變對象,因爲無法判斷兩個可變對象是否相等,也就無法保證set內部“不會有重複元素”。
二、函數
1、定義函數:
在Python中,定義一個函數要使用def
語句,依次寫出函數名、括號、括號中的參數和冒號:
,然後,在縮進塊中編寫函數體,函數的返回值用return
語句返回。
請注意,函數體內部的語句在執行時,一旦執行到return
時,函數就執行完畢,並將結果返回。因此,函數內部通過條件判斷和循環可以實現非常複雜的邏輯。
如果沒有return
語句,函數執行完畢後也會返回結果,只是結果爲None
。
return None
可以簡寫爲return
。
如果你已經把my_abs()
的函數定義保存爲abstest.py
文件了,那麼,可以在該文件的當前目錄下啓動Python解釋器,用from abstest import my_abs
來導入my_abs()
函數,注意abstest
是文件名(不含.py
擴展名)
def my_abs(x):
if x >= 0:
return x
else:
return -x
2、空函數
如果想定義一個什麼事也不做的空函數,可以用pass
語句:
def nop():
pass
pass
語句什麼都不做,那有什麼用?實際上pass
可以用來作爲佔位符,比如現在還沒想好怎麼寫函數的代碼,就可以先放一個pass
,讓代碼能運行起來。
pass
還可以用在其他語句裏,比如:
if age >= 18:
pass
缺少了pass
,代碼運行就會有語法錯誤。
3、參數檢查
調用函數時,如果參數個數不對,Python解釋器會自動檢查出來,並拋出TypeError
:
>>> my_abs(1, 2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: my_abs() takes 1 positional argument but 2 were given
但是如果參數類型不對,Python解釋器就無法幫我們檢查。試試my_abs
和內置函數abs
的差別:
>>> my_abs('A')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in my_abs
TypeError: unorderable types: str() >= int()
>>> abs('A')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: bad operand type for abs(): 'str'
當傳入了不恰當的參數時,內置函數abs
會檢查出參數錯誤,而我們定義的my_abs
沒有參數檢查,會導致if
語句出錯,出錯信息和abs
不一樣。所以,這個函數定義不夠完善。
PS:abs只能接受整數和浮點型(文本型字符串是TypeError,數值型字符串待驗證),而內置的float函數可以接受數值型字符串(文本型字符串是ValueError)、整數。
讓我們修改一下my_abs
的定義,對參數類型做檢查,只允許整數和浮點數類型的參數。數據類型檢查可以用內置函數isinstance()
實現:
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
添加了參數檢查後,如果傳入錯誤的參數類型,函數就可以拋出一個錯誤:
>>> my_abs('A')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in my_abs
TypeError: bad operand type
錯誤和異常處理將在後續講到。
4、返回多個值
import math
def move(x, y, step, angle=0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
其實,返回“多個值”在Python中返回的仍然是單一值,是一個tuple!但是,在語法上,返回一個tuple可以省略括號,而多個變量可以同時接收一個tuple,按位置賦給對應的值,所以,Python的函數返回多值其實就是返回一個tuple,但寫起來更方便。