基础复习
x = 34;y=12;z=43
a = {"x":x,"y":y,"z":z}
print ('--------分割线--------')
for w in sorted(a, key=a.get):
print (w, a[w])
print(sorted(a, key=a.get))
1.语句和语法
- #:注释
- :转译回车,继续上一行,在一行语句较长的情况下可以使用其来切分成多行,因其可读性差所以不建议使用
- ;:将两个语句连接到一行,可读性差,不建议使用
- ::将代码的头和体分开
- 语句(代码块)用缩进方式体现不同的代码级别,建议采用4个空格(不要使用tab)
- python文件以模块的方式组织,编写一个.py结尾的文件实际上就写了一个模块
2.专用下划线标识符
- _xxx:不能用from module import *导入
- xxx:系统定义名字
- __xxx:类中私有变量
下划线对于解释器来说有特殊意义,而且是内建标识符所使用符号,不建议自定义变量以下划线开头
但是如果是类中的私有变量,__xxx将会是一个好习惯
补充:
-
系统变量__name__会根据python文件被加载方式的不同得出不同的值
- python文件被当作模块导入:name=模块名或者文件名
- python文件被执行:name=‘main’
-
在我们使用python编写一个软件时,应该只有一个主程序中包含大量顶级代码(就是没有缩进的代码,
python解释器读取到顶级代码会立即执行),其他.py文件应该只有少量顶级代码,所有功能都应该封装
在函数或类中
-
通常在文件结尾结合__name__变量,编写测试代码
2.1 Python的工作过程
python 把代码读到内存 2、词法语法分析 3、放到编译器 —》 生成字节码 4、执行字节码 —》生成机器码 CPU执行
Python赋值运算符:
运算符 | 描述 | 示例 |
---|---|---|
= | 简单的赋值运算符,赋值从右侧操作数左侧操作数 | c = a + b将指定的值 a + b 到 c |
+= | 加法AND赋值操作符,它增加了右操作数左操作数和结果赋给左操作数 | c += a 相当于 c = c + a |
-= | 减AND赋值操作符,它减去右边的操作数从左边操作数,并将结果赋给左操作数 | c -= a 相当于 c = c - a |
*= | 乘法AND赋值操作符,它乘以右边的操作数与左操作数,并将结果赋给左操作数 | c *= a 相当于 c = c * a |
/= | 除法AND赋值操作符,它把左操作数与正确的操作数,并将结果赋给左操作数 | c /= a 相当于= c / a |
%= | 模量AND赋值操作符,它需要使用两个操作数的模量和分配结果左操作数 | c %= a is equivalent to c = c % a |
**= | 指数AND赋值运算符,执行指数(功率)计算操作符和赋值给左操作数 | c **= a 相当于 c = c ** a |
//= | 地板除,并分配一个值,执行地板除对操作和赋值给左操作数 | c //= a 相当于 c = c // a |
Python 位运算符:
二进制换算成10进制:
128 64 32 16 8 4 2 1
二进制是8位的比如说:01001111 换成10进制的就是:1+2+4+8+64 和上面的对比取值
操作符 | 描述 | 示例 |
---|---|---|
& | 二进制和复制操作了一下,结果,如果它存在于两个操作数。 | (a & b) = 12 即 0000 1100 |
| | 二进制或复制操作了一个比特,如果它存在一个操作数中。 | (a | b) = 61 即 0011 1101 |
^ | 二进制异或运算符的副本,如果它被设置在一个操作数而不是两个比特。 | (a ^ b) = 49 即 0011 0001 |
~ | 二进制的补运算符是一元的,并有“翻转”位的效果。 | (~a ) = -61 即 1100 0011以2的补码形式由于带符号二进制数。 |
<< | 二进位向左移位运算符。左操作数的值左移由右操作数指定的位数。 | a << 2 = 240 即 1111 0000 |
>> | 二进位向右移位运算符。左操作数的值是由右操作数指定的位数向右移动。 | a >> 2 = 15 即 0000 1111 |
is与==的区别
- is比较的是id
- 而==比较的是值
生成器与迭代器
迭代器
特点:
- 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
- 不能随机访问集合中的某个值 ,只能从头到尾依次访问
- 访问到一半时不能往回退
- 便于循环比较大的数据集合,节省内存
>>> a = iter([1,2,3,4,5])
>>> a
<list_iterator object at 0x101402630>
>>> a.__next__() 结束时 StopIteration
生成器generator
定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器
作用:
- 这个yield的主要效果呢,就是可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句开始执行。
def cash_out(amount):
while amount >0:
amount -= 1
yield 1<br> print("擦,又来取钱了。。。败家子!")
ATM = cash_out(5)
print("取到钱 %s 万" % ATM.__next__())
- 另外,还可通过yield实现在单线程的情况下实现并发运算的效果
另外,还可通过yield实现在单线程的情况下实现并发运算的效果
import time
def consumer(name):
print("%s 准备吃包子啦!" %name)
while True:
baozi = yield
print("包子[%s]来了,被[%s]吃了!" %(baozi,name))
def producer(name):
c = consumer('A')
c2 = consumer('B')
c.__next__()
c2.__next__()
print("老子开始准备做包子啦!")
for i in range(10):
time.sleep(1)
print("做了2个包子!")
c.send(i)
c2.send(i)
producer("alex")
生成器
参考:http://www.cnblogs.com/wupeiqi/articles/4980620.html
正则表达式
import re #导入模块名
p = re.compile("^[0-9]") #生成要匹配的正则对象 , ^代表从开头匹配,[0-9]代表匹配0至9的任意一个数字, 所以这里的意思是对传进来的字符串进行匹配,如果这个字符串的开头第一个字符是数字,就代表匹配上了
m = p.match('14534Abc') #按上面生成的正则对象 去匹配 字符串, 如果能匹配成功,这个m就会有值, 否则m为None<br><br>if m: #不为空代表匹配上了
print(m.group()) #m.group()返回匹配上的结果,此处为1,因为匹配上的是1这个字符<br>else:<br> print("doesn't match.")<br>
正则表达式常用5种操作
re.match(pattern, string) # 从头匹配
re.search(pattern, string) # 匹配整个字符串,直到找到一个匹配
re.split() # 将匹配到的格式当做分割点对字符串分割成列表
re.findall() # 找到所有要匹配的字符并返回列表格式
re.sub(pattern, repl, string, count,flag) # 替换匹配到的字符
json与字符串互转
loads:字符串->json
dumps:json->字符串
json 和 pickle
用于序列化的两个模块
- json,用于字符串 和 python数据类型间进行转换
- pickle,用于python特有的类型 和 python的数据类型间进行转换
Json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
进展:https://www.cnblogs.com/alex3714/category/770733.html?page=2
https://www.cnblogs.com/fnng/category/695788.html
python 的****mock
**https://zhuanlan.zhihu.com/p/387903587 **
mock****装饰器使用格式
· @patch(“module名字.方法名”)
· @patch.object(类名, “方法名”)
python 与mock
demo.py
import requests
def send_request(url):
r = requests.get(url)
return r.status_code
def visit_baidu():
url = 'http://www.baidu.com'
return send_request(url)
访问
from unittest import mock
import unittest
import demo
class TestReq(unittest.TestCase):
# def test_request_01(self):
# # 实例化mock对象,指定返回值,替换原有对象
# demo.send_request = mock.Mock(return_value='200')
# print(demo.send_request())
# self.assertEqual(demo.visit_baidu(), '200')
# 在测试的参数里对该Mock对象设置一个参数
@mock.patch("demo.send_request")
def test_request_01(self, mock_request):
# 指定一个返回值
mock_request.return_value = '200'
self.assertEqual(demo.visit_baidu(), '200')
def test_request_02(self):
# 实例化mock对象,指定返回值,替换原有对象
demo.send_request = mock.Mock(return_value='404')
print(demo.send_request())
self.assertEqual(demo.visit_baidu(), '404')
if __name__ == '__main__':
unittest.main(verbosity=2)