語法 傳值與傳引用 Python參數傳遞採用的是“傳對象引用”的方式。這種方式相當於傳值和傳引用的一種綜合。 如果函數收到的是一個可變對象(比如字典或者列表)的引用,就能修改對象的原始值--相當於通過“傳引用”來傳遞對象。 如果函數收到的是一個不可變對象(比如數字、字元或者元組)的引用,就不能直接修 ...
語法
傳值與傳引用
Python參數傳遞採用的是“傳對象引用”的方式。這種方式相當於傳值和傳引用的一種綜合。
- 如果函數收到的是一個可變對象(比如字典或者列表)的引用,就能修改對象的原始值--相當於通過“傳引用”來傳遞對象。
- 如果函數收到的是一個不可變對象(比如數字、字元或者元組)的引用,就不能直接修改原始對象--相當於通過“傳值'來傳遞對象。
數組
數組合併
不能直接使用append函數直接賦值,因為該函數無返回值,可直接用 + 合併兩個數組
判斷相同和不同數目
#介面返回值
list1 = ['張三', '李四', '王五', '老二']
#資料庫返回值
list2 = ['張三', '李四', '老二', '王七']
a = [x for x in list1 if x in list2] #兩個列表表都存在
b = [y for y in (list1 + list2) if y not in c] #兩個列表中的不同元素
print('a的值為:',a)
print('b的值為:',b)
c = [x for x in list1 if x not in list2] #在list1列表中而不在list2列表中
d = [y for y in list2 if y not in list1] #在list2列表中而不在list1列表中
print('c的值為:',c)
print('d的值為:',d)
out:
a的值為: ['張三', '李四', '老二']
b的值為: ['王五', '王七']
c的值為: ['王五']
d的值為: ['王七']
排序
對於具有命名屬性的對象:
>>> student_tuples = [
... ('john', 'A', 15),
... ('jane', 'B', 12),
... ('dave', 'B', 10),
... ]
>>> sorted(student_tuples, key=lambda student: student[2]) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
字典排序
- sorted函數
首先介紹sorted函數,sorted(iterable,key,reverse)
,sorted一共有iterable,key,reverse這三個參數。
其中iterable表示可以迭代的對象,例如可以是dict.items()、dict.keys()等,key是一個函數,用來選取參與比較的元素,reverse則是用來指定排序是倒序還是順序,reverse=true則是倒序(從大到小),reverse=false則是順序(從小到大),預設是reverse=false。
- 按照key排序
要對字典按照key排序,可以直接調用sorted函數。
my_dict = {'lilee':25, 'age':24, 'phone':12}
sorted(my_dict.keys())
輸出結果為
['age', 'lilee', 'phone']
直接使用sorted(my_dict.keys())就能按key值對字典排序,這裡是按照順序對key值進行排序的,如果想按照倒序排序的話,只需要將reverse置為true即可。
sorted(my_dcit.keys(), reverse = true)
- 按照value值排序
共有三種方法可以實現將字典按照value值進行排序
(1)key使用lambda匿名函數取value進行排序
d = {'lilee':25, 'wangyan':21, 'liqun':32, 'age':19}
sorted(d.items(), key=lambda item:item[1])
輸出結果為
[('age',19),('wangyan',21),('lilee',25),('liqun',32)]
如果需要倒序則
sorted(d.items(), key=lambda item:item[1], reverse=True)
得到的結果就會是
[('liqun',32),('lilee',25),('wangyan',21),(age',19)]
(2)使用operator的itemgetter進行排序
import operator
sorted(d.items(), key=operator.itemgetter(1))
輸出結果為
[('age',19),('wangyan',21),('lilee',25),('liqun',32)]
is和==的區別
https://www.cnblogs.com/wangkun122/p/9082088.html
is和==都是對對象進行比較判斷作用的,但對對象比較判斷的內容並不相同。下麵來看看具體區別在哪。
==比較操作符和is同一性運算符區別
==是python標準操作符中的比較操作符,用來比較判斷兩個對象的value(值)是否相等,例如下麵兩個字元串間的比較:
例1.
>>> a = 'cheesezh'
>>> b = 'cheesezh'
>>> a == b
True
is也被叫做同一性運算符,這個運算符比較判斷的是對象間的唯一身份標識,也就是id是否相同。通過對下麵幾個list間的比較,你就會明白is同一性運算符的工作原理:
例2.
>>> x = y = [4,5,6]
>>> z = [4,5,6]
>>> x == y
True
>>> x == z
True
>>> x is y
True
>>> x is z
False
>>>
>>> print id(x)
3075326572
>>> print id(y)
3075326572
>>> print id(z)
3075328140
只有數值型和字元串型的情況下,a is b才為True,當a和b是tuple,list,dict或set型時,a is b為False
後臺
requiremnets.txt
pip freeze > requirements.txt //生成
pip install -r requirements.txt //安裝
用 r取消轉義
虛擬環境創建與激活
pip3 install virtualenv
virtualenv venv
source venv/bin/activate
pip install -r requirements.txt
單元測試
import unittest
class MyTest(unittest.TestCase): # 繼承unittest.TestCase
def tearDown(self):
# 每個測試用例執行之後做操作
print('111')
def setUp(self):
# 每個測試用例執行之前做操作
print('22222')
@classmethod
def tearDownClass(self):
# 必須使用 @ classmethod裝飾器, 所有test運行完後運行一次
print('4444444')
@classmethod
def setUpClass(self):
# 必須使用@classmethod 裝飾器,所有test運行前運行一次
print('33333')
def test_a_run(self):
self.assertEqual(1, 1) # 測試用例
def test_b_run(self):
self.assertEqual(2, 2) # 測試用例
if __name__ == '__main__':
unittest.main()#運行所有的測試用例
json 錯誤xx is not JSON serializable
在使用json的時候經常會遇到xxx is not JSON serializable,也就是無法序列化某些對象
重寫jsonEncoder
import decimal
class DecimalEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
return float(o)
super(DecimalEncoder, self).default(o)
# and then:
json.dumps(chart_list,..., cls=DecimalEncoder)
運行Jupyter Notebook
jupyter notebook --ip=0.0.0.0 --no-browser --allow-root