Python筆記二

Python的特點和優點

  • 解釋性:逐行進行解釋(執行),使得測試和調試變得簡單
  • 動態性
  • 面向對象
  • 語法簡潔
  • 開源
  • GUI編程
  • 便攜式:可以在window、mac、linux或其他任何平臺上運行
  • 豐富的社區資源

淺拷貝與深拷貝的區別

  • 淺拷貝:將對象的引用複製給另一個對象,意味着如果對對象的副本進行更改則會影響原對象
  • 深拷貝:是將對象本身複製給另一個對象,意味着如果對對象的副本進行更改則不會影響原對象

列表與元組的區別

  • 列表可變,元組不可變
>>> list = [1, 2, 3]
>>> list[1] = 5
>>> list
[1, 5, 3]
>>> tuple = (1, 2, 3)
>>> tuple(1) = 5
  File "<stdin>", line 1
SyntaxError: can't assign to function call

解釋python中的三元表達式

  • 與C++不同,python中不使用?符號,而是使用如下語法:
# 如果[expression]爲真,則執行[on true],如果爲假則執行[on false]
[on true] if [expression] else [on false]
  • 例:
>>> a, b = 2, 3
>>> min = a if a<b else b
>>> min
2

python中如何實現多線程

  • 線程是輕量級的進程,多線程允許一次執行多個線程。python是一個多線程語言,它有一個多線程包
  • GIL(Global Interpreter Lock全局解釋器鎖)確保一次執行單個線程。一個線程保存GIL並將其傳遞給下一個線程之前執行一些操作,就會產生並行執行的錯覺,但實際上只是線程輪流在CPU上

什麼叫繼承

  • 一個類繼承自另一個類,也可以說是一個孩子類/派生類/子類,繼承自父類/基類/超類,同時獲取所有的類成員(屬性和方法)
  • 繼承可以使我們可以重用代碼,還可以更方便地創建和維護代碼
  • python支持的繼承類型:
    • 單繼承:一個子類繼承自單個基類
    • 多重繼承:一個子類繼承自多個基類
    • 多級繼承:一個子類繼承自一個基類,而基類繼承自另一個基類
    • 分層繼承:多個子類繼承自同一個基類
  • 混合繼承:兩種或兩種以上繼承類型的組合

什麼是Flask?

  • 它是一個使用Python編寫的輕量級Web應用框架,使用BSD(自由軟件中使用最廣泛的許可協議之一)授權
  • 其WSGI工具箱採用Werkzeug,模板引擎使用Jinja2,除了Werkzeug和Jinja2以外,幾乎不依賴任何外部庫,因爲Flask被稱爲輕量級框架
  • Flask的會話使用簽名cookie來允許用戶查看和修改會話內容,它會記錄從一個請求到另一個請求的信息。如果要修改會話,則必須要有密鑰Flask.secret_key

如何在Python中管理內存

  • python用一個私有堆內存空間來放置所有對象和數據結構,我們無法訪問,由解釋器來管理它
  • 但如果使用一些核心API,我們就可以訪問一些Python內存管理工具控制內存分配

help和dir函數

  • help():返回幫助文檔和參數說明
  • dir():返回對象中所有成員(任何類型)
>>> import copy
>>> help(copy)
Help on module copy:

NAME
    copy - Generic (shallow and deep) copying operations.

DESCRIPTION
    Interface summary:

            import copy

            x = copy.copy(y)        # make a shallow copy of y
            x = copy.deepcopy(y)    # make a deep copy of y

    For module specific errors, copy.Error is raised.
    .................
>>> dir(copy.copy)
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

退出python時是否釋放所有內存分配

  • 不會
  • 那些具有對象循環引用或者全局命名空間引用的變量,在python退出時不會被釋放
  • 也不會釋放C庫保留的部分內容

什麼是猴子補丁

  • 在運行時動態修改已有的代碼(類和模塊),不需要修改原始的代碼
>>> class A:
>>>  	def func(self):
>>>  		print('Hi')
 >>>def monkey(self):
 >>> 	print("Hi, monkey")
 >>> m.A.func = monkey
 >>> a = m.A()
 >>> a.func()
Hi, monkey

python字典

  • 一種可變容器模型,可存儲任意類型對象
  • 字典的每個鍵值對用冒號:分割,每個鍵值對之間用逗號,分割,整個字典在花括號{}中
  • 鍵一般是唯一的,如果重複,最後的一個鍵值對會替換前面的,值不需要唯一
>>> dict = {'a':1, 'b':2, 'b':3}
>>> dict['b']
3
  • 值可以取任何數據類型,但鍵必須是不可變的,如:字符串、數字、元組

解釋*args和**kwargs

  • 當我們不知道將多少個參數傳遞給函數,比如:傳遞一個列表或一個元組值時,就可以使用*args
def func(*args):
    for i in args:
        print(i)
func(3, 2, 2)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3
2
2
  • 當我們不知道將會傳入多少個關鍵字參數時,使用**kwargs會收集關鍵字參數
def func(**kwargs):
    for i in kwargs:
        print(i, kwargs[i])
func(a = 1, b = 2, c = 7)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
a 1
b 2
c 7

編程實現計算文件中的大寫字母數

import os
os.chdir('C:/Users/Life/Desktop')
with open ('Today.txt') as today:
    count = 0
    for i in today.resd():
        if i.isupper():
            count += 1
    print(count)

什麼是負索引

  • 與正索引相反,夫索引是從右邊往左開始檢索
>>> list = [0, 1, 2, 3, 4, 5]
>>> list[-2]
4
>>> list[-5 : -2]
[1, 2, 3]

如何隨機打亂列表中元素,要求不引用額外的內存空間

  • 使用shuffle函數
>>> from random import shuffle
>>> list = [1, 2, 3, 4, 5]
>>> shuffle(list)
>>> list
[4, 1, 5, 3, 2]

join()和split()

  • join():可以將指定字符添加到字符串中
>>> ':'.join('1, 2, 3, 4')
'1:,: :2:,: :3:,: :4'
  • split():可以用指定的字符分割字符串
>>> '1,2,3,4'.split(',')
['1', '2', '3', '4']

python是否區分大小寫

區分

>>> YQ = yq
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'yq' is not defined

python標識符命名規則

  • 字符串可以時任意長度
  • 只能以下劃線、大小寫字母開頭(A-Z/a-z)
  • 其餘部分只能使用A-Z/a-z
  • 標識符區分大小寫
  • 關鍵字不能作爲標識符(關鍵字如下)
    -

如何刪除字符串中的前置空格

  • 使用lstrip去除前置空格
>>> '  YQ'.lstrip()
'YQ'
  • 使用rstrip去除前置空格
>>> ' YQ '.rstrip()
' YQ'

如何將字符串轉爲小寫

  • 使用lower()
>>> 'YQ'.lower()
'yq'
  • 轉爲大寫使用upper()
>>> 'yq'.upper()
'YQ'
  • 檢查字符串是否爲全大寫或全小寫,使用isupper()和islower()
    • 像@和$這樣的字符既滿足大寫也滿足小寫
>>> 'YQ'.isupper()
True
>>> 'YQ'.islower()
False
>>> '@YQ'.isupper()
True
>>> '@yq'.islower()
True
>>> '$YQ'.isupper()
True
>>> '$yq'.islower()
True
  • istitle()可以檢索字符串是否是標題格式

pass語句的作用

  • 寫代碼時可能只寫了函數聲明還沒有想好函數怎麼寫,但爲了保證語法檢查正確必須輸入一些東西,此時使用pass
>>> def func(*args):
... pass
  • 類似的break語句可以跳出循環
for i in range(6):
    if i == 5 : break
print(i)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
  • continue語句可以跳到下一輪循環
for i in range(6):
    if i == 5 : continue
print(i)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5

什麼是閉包

參考

  • 作用域:程序運行時變量可被訪問的範圍,定義在函數內的變量時局部變量,局部變量的作用範圍只能只能是函數內部範圍內,不能再函數外引用
def foo():
	a = 10   #a爲局部變量
print(a)   #NameError: name 'a' is not defined
a = 10   #a爲全局變量,,全局範圍內可見,在函數裏面也可以讀取
def foo():
	print(a)   #10
  • 嵌套函數:不僅可以定義在模塊最外層,還可以定義在另一個函數內部,定義在函數裏面的函數稱爲嵌套函數,可以訪問到外層作用域中聲明的非局部變量
def print_msg():   #外圍函數
	msg = 'I am YQ'
	def printer():   #嵌套函數
		print(msg)
	printer()
print_msg()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
I am YQ
  • 閉包:如果在一個內部函數裏,對外部作用域(但不是在全局作用域)的變量進行引用,那麼內部函數就是一個閉包。
    • 它脫離了函數本身的作用範圍,依舊能夠對局部變量進行訪問
    • 閉包避免了使用全局變量
def print_msg():
	msg = 'I am YQ'
	def printer():
		print(msg)
	return printer  #此時的printer作爲返回值返回了

another = print_msg()  #這裏的another就作爲閉包,他是的局部變量msg在函數外被訪問
another()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
I am YQ

python中有多少種運算符,分別解釋

參考
7種運算符:算術、關係(比較)、賦值、邏輯、位、成員、身份運算符

  • 算數運算符:+ - * / // ** %
    • +:加法
    • -:減法
    • *:乘法
    • /:除法
    • //:地板除法,向下取整
    • **:取冪
    • %:返回除法後的餘數
>>> 7//2
3
>>> 2**3
8
>>> 13%2
1
  • 關係運算符:用來比較兩個對象
    在這裏插入圖片描述
  • 賦值運算符
    • =:簡單的賦值
    • +=:加法賦值
    • -+:減法賦值
    • *=:乘法賦值
    • /=:除法賦值
    • %=:取模賦值
    • **=:冪賦值
    • //=:取整除賦值
  • 位運算符:按位運算符是把數字當作二進制來計算的
    • $:按位與,參與運算的兩個值,若相應位都爲1,則該位爲1
    • | :按位或,只要對應的兩個二進位有一個爲1,結果爲1
    • ^:按位異或,兩對應二進位相異結果爲1
    • ~:按位取反,1變爲0,0變爲1
    • <<:左移,符號右邊數字指定移動若干位,高位丟棄,低位補零
    • :右移,符號右邊數字指定移動若干位

>>> a = 60   # 60 = 0011 1100
>>> b = 13   # 13 = 0000 1101
>>> a & b
12   # 12 = 0000 1100
>>> a | b
61   # 61 = 0011 1101
>>> a ^ b
49   # 49 = 0011 0001
>>> ~ a
-61   # -61 = 1100 0011
>>> a << 2
240   # 240 = 1111 0000
>>> a >> 2
15   # 15 = 0000 1111
  • 邏輯運算符(x, y)
    • and,x爲False返回false,否則返回y值
    • or :x爲非0返回x值,否則返回y值
    • not:x爲False返回True,否則返回False
  • 成員運算符
    • in:指定序列找到值返回True,否則返回False
    • not in:指定序列沒有找到值返回True,否則返回False
>>> a = 10
>>> b = 5
>>> list = [1, 2, 3, 4, 5]
>>> a in list
False
>>> a not in list
True
>>> b in list
True
>>> b not in list
False
  • 身份運算符:用於比較兩個對象的存儲單元
    • is:判斷倆標識符是否引自同一個對象
    • is not:判斷倆標識符是否引自不同對象
>>> a = 20
>>> b = 20
>>> a is b
True
>>> b = 30
>>> a is b
False
>>> a is not b
True

python中如何使用多進制數字

  • python中可以使用十進制、二進制、八進制、十六進制
  • 二進制由0、1組成,用 0b 或者 0B作爲前綴表示,bin()可將數字轉爲二進制
  • 八進制由數字0-7組成,用 0o 或者 0O作爲前綴表示,oct()可將數字轉爲八進制
  • 十六進制由數字 0-15 組成,用 0x 或者 0X作爲前綴表示,hex()可將數字轉爲十六進制
>>> bin(8)
'0b1000'
>>> oct(8)
'0o10'
>>> hex(8)
'0x8'
>>> hex(16)
'0x10'
>>> hex(15)
'0xf'

如何獲取字典中所有鍵

  • 使用函數key()
>>> dict = {'1':3, 'a':5, 'haha':55}
>>> dict.keys()
dict_keys(['1', 'a', 'haha'])

標識符爲什麼不建議使用下劃線開頭

在python中下劃線開頭的變量爲私有變量,如果不想讓變量私有,就不建議使用下劃線開頭

如何生聲明多個變量並賦值

兩種方法

>>> a, b, c = 2, 3, 4
>>> a
2
>>> b
3
>>> c
4

>>> a = b = c = 2
>>> a
2
>>> b
2
>>> c
2

什麼是元組的解封裝

>>> tuple = 3, 4, 5  #將3, 4, 5封裝到元組tuple中
>>> tuple
(3, 4, 5)
>>> x, y, z = tuple  #將tuple中的值解封裝到變量x, y, z中
>>> x + y + z
12
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章