使用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