1. 程式人生 > 實用技巧 >python基礎語法(一)

python基礎語法(一)

1.垃圾回收機制

  1. 引用計數
>>> x = 10  # 直接引用
>>> print(id(x))
140725056100288
>>>
>>> y = x
>>> z = x
>>>
>>> l = ['a',]
>>> print(id(l[0]))
2245258076400
>>> print(id(l[1]))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> print(x)
10
>>> l = ['a',x]
>>> print(id(l[1]))
140725056100288
>>>
  1. 什麼是垃圾回收機制
    1. 垃圾回收機制(簡稱GC)是python直譯器自帶的一種機制,專門用來回收不可用的變數值所佔用的記憶體空間
  2. 為什麼要用垃圾回收機制
    1. 程式執行過程中會申請大量的記憶體空間,而對於一些無用的記憶體空間如果不及時清理的話會導致記憶體清理殆盡(記憶體溢位),導致程式崩潰,因此管理記憶體是一件重要且繁雜的事,而python直譯器自帶的垃圾回收機制把程式設計師從繁雜的記憶體管理中解放出來
  3. 標記清除機制:
# 迴圈引用導致記憶體洩漏
>>> l1 = [111,]
>>> l2 = [222,]
>>>
>>> l1.append(l2)
>>> id(l1),id(l2)
(2245287352384, 2245287683712)
>>>
>>> l1
[111, [222]]
>>>
>>> id(l1[1])
2245287683712
>>>
>>> l2.append(l1)
>>>
>>> l2
[222, [111, [...]]]
>>>
>>> id(l2[1])
2245287352384
>>>
  1. 分代回收

背景:

  1. 基於引用計數的回收機制,每次回收記憶體,都需要把所有物件的引用計數都遍歷一遍,這是非常消耗時間的,於是引入分代回收來提高回收率,分代回收採用的是“空間換時間”的策略。

分代:

  1. 分代回收的核心思想是,在歷經多次掃描的情況下,都沒有被回收的變數,gc機制就會認為,該變數是常用變數,gc對其掃描的頻率會降低具體實現原理如下:
    1. 分代是根據存活時間來為變數劃分不同等級(也就是不同的代)
    2. 新定義的變數 ,放到新生代這個等級中,假設每隔一分鐘掃描新生代一次,如果發現變數依然被引用那麼

回收:

  1. 回收依然是使用 引用計數作為回收的一句

2.使用者互動

# 接收使用者的輸入
# 在python3中input會將使用者輸入的所有內容都存成字串型別儲存起來賦值給變數名
# username = input('請輸入您的賬號:')
# print(username, type(username))

# age = input("請輸入你的年齡:")  # age = "18"
# print(age, type(age))
#
# age = int(age)  # int只能將純數字的字串轉成整型
# print(age > 16)
# 在python2中:
# raw_input():用法與python3中的input一模一樣
# input():要求使用者必須輸入一個明確的資料型別,輸入的是什麼型別,就存成什麼型別

>>> age = input('>>>>>')
>>>>>18
>>> age,type(age)
(18, <type 'int'>)
>>> x = input('>>>>>')
>>>>>1.2
>>> x, type(x)
(1.2, <type 'float'>)
>>> x = input('>>>>>')
>>>>>[1,2,3]
>>> x, type(x)
([1, 2, 3], <type 'list'>)
>>>

3.字串格式化輸出

# 格式化輸出
# 按照位置與%s一一對應,少一個不行,多一個也不行
# res = "my name is %s my age is %s" % ('egon', '18')
# res = "my name is %s my age is %s" % ('18', 'egon')
# res = "my name is %s" % 'egon'
# print(res)

# 以字典的方式傳值
res = "我的名字是 %(name)s my age is %(age)s" % {'name':'egon', 'age':'18'}
print(res)


# print('my age is %s' % 18)
# print('my age is %s' % [1, 23])
# print('my age is %s' % {'age': 18})


# print('my age is %d'%18)
# print('my age is %d'%'18')  # %d只能接受int
# str.formate(),相容性好,推薦使用

# res = "my name is {} my age is {}".format('egon', '18')
# print(res)

# res = "my name is {0} {0} {0} my age is {1} {1}".format('egon', '18')
# print(res)

# 打破位置的限制,按照key = value傳值
res = "我的名字是{name},我的年齡是{age}".format(age=18, name='egon')
print(res)
# f''

x = input('請輸入姓名:')
y = input('請輸入年齡:')
res = f'我的姓名是{x},我的年齡是{y}'
print(res)

4.基本運算子

1.算術運算子

print(20 + 3)

print(10 / 3)  # 結果帶小數
print(10 // 3)  # 結果只保留整數部分

print(10 % 3)  # 取模、取餘數
print(10 ** 3)  # 次方

2.比較運算

print(10 > 3)
print(10 < 3)
print(10 >= 10)
print(10 <= 10)
print(10 == 10)
print(10 != 10)

5.賦值運算

1.增量賦值

age = 19
age += 1
print(age)

age -= 1
age /= 1
age //= 1
age %= 1
age **= 1
age *= 1

2.鏈式賦值

x = 10
z = x
y = x

x = y = z = 10
print(x, y, z)
print(id(x), id(y), id(z))

3.交叉賦值

m = 10
n = 20
print(m, n)

# 交叉賦值
temp = m
# m = n
# n = temp
# print(m, n)

# 一行搞定
m, n = n, m
print(m, n)

4.解壓賦值

num = [1, 2, 3, 4, 5]
m = num[0]
n = num[1]
x = num[2]
y = num[3]
z = num[4]
print(m, n, x, y, z)

m, n, x, y, z = num
print(m, n, x, y, z)

m, n, x, y, z, p = num  # 對應的變數名多一個不行
m, n, x, y = num  # 對應的變數名少一個也不行

# 引入*,可以幫我們取兩頭的值,無法取中間的值

# 取前面三個值
m, n, x, *_ = num
print(m, n, x)

# 取後面三個值
*_, m, n, x = num
print(m, n, x)

m, *_, x, y = num
print(m, x, y)

# 解壓字典預設解壓出來的是字典的key
x, y, z = {'a': 1, 'b': 2, 'c': 3}
print(x, y, z)