變數: Python 是動態類型語言, 也就是說不需要預先聲明變數的類型。變數是對象的引用,變數只是將指針指向了對象所在的記憶體地址。變數的類型和值在賦值那一刻被初始化。 變數起名: 1.顯式-->通俗易懂 2.nums_of_alex_gf = 19 3.NumsOfAlexGf = 20 駝峰寫法
變數:
Python 是動態類型語言, 也就是說不需要預先聲明變數的類型。變數是對象的引用,變數只是將指針指向了對象所在的記憶體地址。變數的類型和值在賦值那一刻被初始化。
變數起名:
1.顯式-->通俗易懂
2.nums_of_alex_gf = 19
3.NumsOfAlexGf = 20 駝峰寫法
4.中橫線不能作為變數的命名字元
5.數字不能作為開頭,但可以在中間或者結尾
6.特殊字元不能作為變數名的組成部分
7.不能使用空格
8.關鍵字不能聲明為變數
變數賦值
Python中的變數不需要聲明,變數的賦值操作既是變數聲明和定義的過程。
每個變數在記憶體中創建,都包括變數的標識,名稱和數據這些信息。
每個變數在使用前都必須賦值,變數賦值以後該變數才會被創建。
等號(=)用來給變數賦值。
等號(=)運算符左邊是一個變數名,等號(=)運算符右邊是存儲在變數中的值。
多個變數賦值
Python允許你同時為多個變數賦值。例如:
a = b = c = 1以上實例,創建一個整型對象,值為1,三個變數被分配到相同的記憶體空間上。
您也可以為多個對象指定多個變數。例如:
a, b, c = 1, 2, "john"以上實例,兩個整型對象1和2的分配給變數a和b,字元串對象"john"分配給變數c。
問題:
現在有一個包含N 個元素的元組或者是序列,怎樣將它裡面的值解壓後同時賦值
給N 個變數?
任何的序列(或者是可迭代對象) 可以通過一個簡單的賦值語句解壓並賦值給多個
變數。唯一的前提就是變數的數量必須跟序列元素的數量是一樣的。
>>> p = (4, 5) >>> x, y = p >>> x 4 >>> y 5 >>> >>> data = [ 'ACME', 50, 91.1, (2012, 12, 21) ] >>> name, shares, price, date = data >>> name 'ACME' >>> date (2012, 12, 21) >>> name, shares, price, (year, mon, day) = data >>> name 'ACME' >>> year 2012 >>> mon 12 >>> day 21 >>>View Code
這種解壓賦值可以用在任何可迭代對象上面,而不僅僅是列表或者元組。
包括字元串,文件對象,迭代器和生成器。
有時候,你可能只想解壓一部分,丟棄其他的值。對於這種情況Python 並沒有提
供特殊的語法。但是你可以使用任意變數名去占位,到時候丟掉這些變數就行了。
>>> data = [ 'ACME', 50, 91.1, (2012, 12, 21) ]
>>> _, shares, price, _ = data
>>> shares
50
>>> price
91.1
問題:
如果一個可迭代對象的元素個數超過變數個數時,會拋出一個ValueError 。那麼
怎樣才能從這個可迭代對象中解壓出N 個元素出來?
Python 的星號表達式可以用來解決這個問題。
>>> record = ('Dave', '[email protected]', '773-555-1212', '847-555-1212')
>>> name, email, *phone_numbers = record
>>> name
'Dave'
>>> email
'[email protected]'
>>> phone_numbers
['773-555-1212', '847-555-1212']
星號表達式也能用在列表的開始部分。比如,你有一個公司前8 個月銷售數據的序
列,但是你想看下最近一個月數據和前面7 個月的平均值的對比。你可以這樣做:
*trailing_qtrs, current_qtr = sales_record
trailing_avg = sum(trailing_qtrs) / len(trailing_qtrs)
return avg_comparison(trailing_avg, current_qtr)
下麵是在Python 解釋器中執行的結果:
>>> *trailing, current = [10, 8, 7, 1, 9, 5, 10, 3]
>>> trailing
[10, 8, 7, 1, 9, 5, 10]
>>> current
3
值得註意的是,星號表達式在迭代元素為可變長元組的序列時是很有用的。比如,
下麵是一個帶有標簽的元組序列:
records = [
('foo', 1, 2),
('bar', 'hello'),
('foo', 3, 4),
]
def do_foo(x, y):
print('foo', x, y)
def do_bar(s):
print('bar', s)
for tag, *args in records:
if tag == 'foo':
do_foo(*args)
elif tag == 'bar':
do_bar(*args)
foo 1 2
bar hello
foo 3 4
星號解壓語法在字元串操作的時候也會很有用,比如字元串的分割。
代碼示例:
>>> line = 'nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false'
>>> uname, *fields, homedir, sh = line.split(':')
>>> uname
'nobody'
>>> homedir
'/var/empty'
>>> sh
'/usr/bin/false'
有時候,你想解壓一些元素後丟棄它們,你不能簡單就使用* ,但是你可以使用一
個普通的廢棄名稱,比如或者ign 。
代碼示例:
>>> record = ('ACME', 50, 123.45, (12, 18, 2012))
>>> name, *_, (*_, year) = record
>>> name
'ACME'
>>> year
2012
在很多函數式語言中,星號解壓語法跟列表處理有許多相似之處。比如,如果你有
一個列表,你可以很容易的將它分割成前後兩部分:
>>> items = [1, 10, 7, 4, 5, 9]
>>> head, *tail = items
>>> head
1
>>> tail
[10, 7, 4, 5, 9]
>>>
如果你夠聰明的話,還能用這種分割語法去巧妙的實現遞歸演算法。比如:
>>> def sum(items):
... head, *tail = items
... return head + sum(tail) if tail else head
...
>>> sum(items)
36