
--------------------------------------------------------------------------------------
Day1
1、概述
2、环境搭建、工具安装与配置
3、Python的运行原理
4、基本知识：缩进与行、跨行、注释
5、字符集编码问题
6、变量与数据类型
7、Python的内存管理机制（指针存储、动态类型、可变与不可变、引用计数）
8、Python的内置数据类型
9、Python的运算符（算数、比较、赋值、逻辑、成员、三目）
10、字符串常用属性与操作
11、输入与输出
12、控制语句之分支语句
---------------------------------------------------------------------------------------
Day2
13、控制语句之循环语句
14、元组
15、列表
16、字典
17、函数
---------------------------------------------------------------------------------------
Day3
18、类和对象
19、异常
---------------------------------------------------------------------------------------
Day4
20、模块
21、常用标准库
22、Python多线程
23、装饰器（权重）
24、上下文协议、文件读写
25、数据库操作
26、web相关
------------------------------------------1、概述(9:30-9:40)--------------------------------------------
新的性能课程体系，前4天 Python语言基础

原因：
	1. 性能测试工具选型——Locust 

	    --开源(Python)、支持二次开发、易于平台化
	    --基于协程，节省资源开销，支持高并发
	    --HTML+JS界面，整洁、跨平台、易扩展

	    --使用Python语言编写脚本

	2. 企业、社会对测试代码能力的要求提升
		--更好地应对笔试、面试
		--突破职场瓶颈、拓宽发展空间

	3. Python的应用越来越广泛
	    --自动化测试、大数据、人工智能
	    --语法相对简单、易上手
	    --自带标准库、扩展库非常多 Battery included	    
	    --可以方便地操作其他程序，引入其他语言写成的库

学习的侧重点有哪些？
	测试用到的知识点
	Python基础语法和知识点
	Python常用模块、常用的第三方库

学习方法：
	讲过的内容，认真练习（抄写、调试、自己写）
	做好作业，按时提交
	多练习
	100天  每天100行  

原则：
	不追求难，只追求通用、实用
	测试中用不到的难点，可以后续工作中自己寻求新的突破

--------------------------------------2、环境搭建与配置(9:40-9:50)-------------------------------------------
一、安装Python-解释器和虚拟机

	*目前常用的有Python2.X和Python3.X

	Python3.X相对之前版本是一次较大的升级，
	Python3.X在设计时没有考虑向下兼容。
	python3 和 python2 有一些差异。
	两个版本目前都在维护，可以选用。
	
	*选择哪个版本进行学习？Python3
		
	从Python2切换到Python3，难度并不大：
		官方迁移指南提供了在Python 3中运行Python 2代码的建议
		区别：http://www.runoob.com/python/python-2x-3x.html

	Windows：
		下载地址：https://www.python.org/downloads/windows/

	Linux（下载源码进行安装）
		下载地址：https://www.python.org/downloads/source/

	Mac OS X
		下载地址：https://www.python.org/downloads/mac-osx/

二、PATH环境变量配置
	环境变量作用
	设置方法

三、Python编辑器安装
    1.cmd下执行python  交互式解释器模式
    2.安装python自带的编辑器IDLE
    3.专业的编辑器 Pycharm 优点：
      人性化设计：代码联想与提示等

    PyCharm安装与破解

    配置：
	    主题、字体、字号设置 

------------------------------------------3、Python的运行原理(9:50-10:00)-------------------------------------------
编写第一个程序
	创建Python项目，“Pure Python”  
	改名

	*Python虚拟环境

	项目下创建python文件
	创建项目的默认路径
	文件：day1.py
	内容：最简单

运行方法：
	1、Pycharm直接运行
	2、cmd命令行执行

***练习：
	自己创建一个项目，创建一个简单的python文件，两种方式（Pycharm、cmd命令行）执行

运行原理：
	Python、Java-先编译、后解释-虚拟机（图）

	.pyc演示 day1.py  demo.py

手动编译（了解）：
	目的：执行效率更高，看不到原始代码，暂时保密

	python -m py_compile filepath
	python -m compileall dirpath
------------------------------------------4、一些Python的基本知识（10:00-10:30）-------------------------------------------

1、缩进

	大部分语言用{}标识代码块，嵌套很深时，大括号层数很多
	为了清晰，需要通过缩进来帮助查看

	Python
强制缩进
	习惯：每一层级，固定缩进4个字符(空格)

	要求：
		1、使用固定的编辑器
		2、采用4个空格进行缩进

	对于PyCharm，默认配置——一个Tab符相当于4个空格
	其他编辑器不可以用Tab符

错误举例，使用notepad++编辑,

def mytest():
	if True:
		print('a')
	else:
		print('b')  #以上缩进都是使用制表符
        print('c')  #此行采用空格缩进

mytest()

以下使用pycharm编辑，自动缩进和tab都会被处理成四个一组的空格
def mytest2():
    if True:
        print('a')
    else:
        print('b')  自动缩进
        print('c')  两个tab
        print('d')  8个空格


2、换行显示
	字符串\
	表达式\
	定义的列表、元组，等

	python中不需要以分号作为语句结束,正常换行自动结束

3、定义多行字符串
	xml举例-天气webservice接口

4、注释
	作用：（1）代码功能说明
	      （2）保留代码，但暂不执行


	单行注释 
	多行注释(区域注释) 
	批量注释
	特殊注释
		#! /usr/bin/python
		    Linux下指定运行脚本文件时使用的解释器，Windows不需要

5、单引号、双引号

6、字符集编码 
	计算机存储、处理数据的方式
		
		ASCII:
			最早只有127个字母被编码到计算机里，也就是大小写英文字母、数字和一些符号
			1个字节
			A的编码是65，a的编码是97，小写字母z的编码是122	

		GBXXXX:
			处理中文
			2个字节--65535
				原本ASCII有的字符
				7000多个简体汉字
				数学符号、罗马希腊的字母、日文的假名
			GB2312---GBK(扩展)

		Unicode
			把所有语言都统一到一套编码里
			unicode是一种编码标准，
			具体的实现方法可能是utf-8，utf-16，gbk ……
			
			2字节表示一个字符 UTF-16
			4字节表示一个字符 UTF-32
			
			UTF-8
				可变长编码
				UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节
					常用的英文字母被编码成1个字节，汉字通常是3个字节

------------------------------------------5、变量与数据类型（AB 10:45-11:55）-------------------------------------------
数据类型
    为了规定数据的存储方式，包括分配内存和磁盘空间，限制存储内容
 
    数据分为  变量   和   常量

  
变量

    变量：占用一部分内存空间，用来存放变量的值(或地址)。用一个标识符(identifier)来表示
          a
          number ID
          class_16_name1

          字母 数字 下划线 以字母或下划线开头

          区分大小写

          number
          Number

    变量的赋值
        =
        变量名=变量值
        变量名=其他变量名
        变量名=表达式
        变量名=函数(返回值)


		a = 1
		print(a)

		a = 1
		a = a + 1
		print(a)

		if a == 1:
		    print('ok')

		a = 1
		b = a
		print(b)

		a = 1
		b = 2
		c = a + b * 2
		print(b)

 C和Java的变量
 	
 	使用前先定义，定义时指定变量的数据类型
 	强制数据类型

 	int a;
 	....
    a = 2;
    a = 3;
    a = 'haha';    #会报错

 Python的变量
    
    （1）不用预先定义，首次赋值时即实现定义
    （2）赋值可以使用任意类型的数据
    （3）一个变量的类型不固定
    （4）变量值有固定的类型

查看数据类型
	type(变量名)

    a = 1
	print(type(a))
	a = 1.2
	print(type(a))
	a = 'haha'
	print(type(a))

为什么会有这样的区别呢？

    内存管理机制 Java、C
                 Python

    通过id(变量名)可以查看变量指向的内存地址


*函数简介

		数值型
			int 整数  实际为长整型，动态长度，最小24字节
			float 浮点数  24字节 

			类型转换
				自动类型转换
					float>int
					+ - *运算时，若类型 不一致，会转换成float型进行运算

				强制类型转换
					int（X）转换X到一个普通整数
					float（X）转换X到浮点数字
					chr（X） 将一个整数转换为可对应ASCII的字符
					ord（X） 将一个字符转换为对应的ASCII码数值   

		布尔型
			True、False--注意大小写
	
		字符串
		'''
			  ABC
			  I'm OK
			  Mary said, "I'm OK"
        '''
			 转义字符：
			 	作用：
			 		  1.去掉某些特殊字符的特殊含义，而使用其作为一个普通字符
			 		    字符串中的单、双引号、反斜线


			 		   2.反斜线与一些字母连用，为了表示一些特殊含义
			 		   '''
			 					\n 换行
			 					\r 退回到行首，后续输入会覆盖前面的输入
						    	\t 制表符

					    \\	代表一个反斜线字符
						'''

			  r的应用
				  字符串前加r，代表忽略内部的转义字符

			  ***练习：分别输出以下内容
				'''
					1. 用换行符和多行注释分别输出
						Bob said
						I'm OK.
					2. div[@id='goodItem']/a	
					3. Bob said "I'm OK".
					4.  "C:\Program Files\fnord\foo\bar\baz\frozz"
					5. ^test/\d{n,}/$
				'''
			str(x)将对象 x 转换为字符串

		元组（Tuple）、列表、字典

	    空值  None

	    	None有自己的数据类型NoneType
	    	None表示一个空对象
			不是0、False、空字符串
	    	None和任何其他的数据类型比较永远返回False
	    	
	    	如果函数无return，则默认返回None
	
	** 可变数据类型与不可变数据类型

			不可变类型：内存中的那块内容的值不可以被改变。
				数字、字符串、布尔值、元组

			可变类型：内存中的那块内容的值是可以改变的。
				列表（List）
				字典（Dictionary）
				其它对象
			（1）当企图通过+=、append等修改该内存地址内容时，可变类型不会创建出新对象，只在原来地址上对值进行修改。
			（2）无论是可变还是不可变类型，对一个变量重新赋值都会创建出新对象；

				a = (1, 2, 3)
				print(id(a))

				a += (4,)
				print(id(a))


				a = [1, 2, 3]
				print(id(a))

				a += [4,]
				print(id(a))
------------------------------------------6、运算符（13:30-14:50）-------------------------------------------
算术运算符
	+ 
	- 
	* 
	/ 结果的类型为float
	
	9/2   4.5

	** 幂
	2**3

	%  取余

	// floor除
		不管操作数为何种数值类型，总是会舍去小数部分，返回数字序列中 比真正的商小的 最接近的 整数数值，
		数值类型取决于操作数的类型。  

	练习：
			 请写出以下程序的运行结果
				a = 21
				b = 10

				print(a / b)
				print(a % b)

				a = 11
				b = 3  

				print(a//b)
				print(a//float(b))

				a = -11.0
				b = 3
				print(a//b)

比较(关系)运算符

	返回值为布尔值
	不仅可以比较数值，还可以比较其他类型，字符串、布尔值

	== 等于 - 比较对象的值是否相等

	!= 不等于

	>

	<

	>=

	<=

	is 两个引用(变量)所指的对象是否相同


	a is b
	id(a) == id(b)

		不可变数据类型：

	        *数值、字符串、布尔值

	            定义多个变量，若它们值相等，则这些变量是指向同一对象

	        a = 'True'
	        b = 'True'

	        id(a) == id(b)
	        a is b 


	        *元组
	            定义多个变量，若通过直接赋值方式使它们值相等，指向的不是同一对象；
	            			  若通过传递的方式赋值，可以使它们指向同一对象。


	    可变数据类型：

	        列表、字典
	        	定义多个变量，若通过直接赋值方式使它们值相等，指向的不是同一对象；
	            			  若通过传递的方式赋值，可以使它们指向同一对象。
	            			  此时如果对一个变量的值进行了修改，则其他变量的值也会发生变化。



	练习：

		请写出以下程序的运行结果

				a = 1
				b = 1
				print(id(a) == id(b))        
				print(a is b)               

				a = 2
				print(id(a) == id(b))         
				print(a is b)               

				c = "very good morning"
				d = "very good morning"
				print(id(c) == id(d))         

				c = True
				d = True
				print(c is d)                 

				e = [1, 2, 3]
				f = [1, 2, 3] 
				print(id(e) == id(f))         
				print(e == f)                
				print(e is f)                 

				g = [4, 5, 6]         
				id1 = id(g)
				g.append(7)
				id2 = id(g)
				print(id1 == id2)             

赋值运算符
	=	
	+=
	-=
	*=
	/=
	%=
	**=
	//=
	
	连续赋值
		a=b=c=1
		a,b,c=1,2,3
	
	值互换
		a,b=b,a

逻辑运算符

	and  
	or 
	not 

	结果： True False

	表达式：任意表达式
	无论结果是否布尔型

	在作为逻辑运算符的操作数时，
	'0、空字符串、空列表、空元组、空字典、None'被作为False处理，其他作为True处理。

	注意：短路逻辑

		and 多个表达式都成立（为True），结果才成立；只要有一个不成立，结果就不成立，后面的不再计算

		or  多个表达式中只要有一个成立（为True），结果就成立，后面的不再计算

		1 and 2 and 3 and 4

		1 or 2 or 3 or 4

	***练习：写出下面程序的执行结果

		def a():
		    print('A')
		    return 0

		def b():
		    print('B')

		def c():
		    print('C')
		    return []

		def d():
		    print('D')
		    return False

		if a() or b() or c() or d():   
		    print('ok')

		if a() and b() and c() and d():   
		    print('ok')

成员运算符

	in  	如果在指定的序列中找到一个变量的值，则返回true，否则返回false
	                    序列：有序的队列 字符串 元组 列表
	not in  如果在指定序列中找不到变量的值，则返回true，否则返回false
	应用：查看字符串中是否含有某个值
		print('e' in 'hello')
		print('ll' in 'world')

身份运算符

	也属于比较的一种，结果是布尔值(见前述内容)
	is
	is not	

三目运算符

	为真时的结果 if 判定条件 else 为假时的结果  
		  1 if 5>3 else 0

 ++ 和 --	
	 Python不支持

------------------------------------------7、字符串常用属性与操作（AB 15:05-16:10）-------------------------------------------
字符串的定义、赋值

	单引号、双引号、混用：可以在一定程度上避免使用转义字符
	长字符串--当字符串跨行

格式化输出

	"您账户xxxx于xx月xx日入账工资，人民币xxxx.xx，xxxxxxxxxxxxxxxxxxx"之类的短信，

	xxx的内容都是根据变量变化的

	通过%?格式化输出：

		在Python中，采用的格式化方式和C语言是一致的，用%实现
			在字符串内部，%？代表此处的内容需要被变量填充
				数据类型不同
					%s	字符串
						如果字符串中有% 改用%%
					%d	整数
					%f	浮点数
						格式化整数和浮点数还可以指定整数与小数的位数 '%.2f'

					%x	十六进制整数
				如果你不太确定应该用什么，%s永远起作用，它会把任何数据类型转换为字符串
			在字符串外部，有几个%?占位符，后面就跟几个变量或者值，顺序要对应好。如果只有一个%?，括号可以省略

			格式：' xxx%s,"%d" '%('aaa', 123)



    通过字符串的format()函数格式化输出：
   
		format
			str.format(text) 
			str中包含占位符，text中是要填充的内容
				使用'{name}'形式的占位符
				使用'{}'占位符
				使用'{0}','{1}'形式的占位符
	
			***练习:

				1.练习：格式化输出以下字符串：
				'亲爱的小岳岳你好！你9月的话费是32.00元，余额是18.00元'
				其中姓名、月份、话费、余额为可变的值。
				用%?占位符和format()两种方法实现。
          
            ***作业：

				1.输出一个get请求地址，形如：
				http://192.168.2.111/huice/event/api/add?title=python大会&time=2018-01-06
                其中可变的内容为：
                	协议类型：形如http
                	主机名：形如192.168.2.111
                	地址：形如huice/event/api/add
                	参数：形如title=python大会&time=2018-01-06
				


常用属性和操作

	长度
		内置方法len(string)


	序列

		在Python中，最基本的数据结构是序列 -- 有序的队列

		序列中的每个元素被分配一个序号——即元素的位置，也称为索引

		第一个索引是 0，第二个则是 1，以此类推

        若长度为n，则最后一个元素的索引为n-1

		序列中的最后一个元素标记为 -1，倒数第二个元素为 -2

		常用的内建序列：
			列表、元组、字符串
		
		“字符串其实就是一个字符元素组成的序列”
	
	索引和分片(切片)

		索引：string[index]

			超出索引：IndexError: string index out of range
			
			*遍历字符串中的每个字符
				0到   len-1

			*翻转输出每个字符
			    -1 到 -len

		分片（截取）
			格式：string[头下标:尾下标:步长]

				步长默认为1

				头下标为空：从第一个字符开始截取
				尾下标为空：截取到最后
				[:]字符串“拷贝”
				越界不会报错,取到结尾

		字符串翻转
			[::-1]

		字符串连接
			+
			1.可以通过加号进行拼接，但非字符串型需要先强制转成字符串型，使用str()函数转换

			2.每连接一次，就要重新开辟空间，然后把字符串连接起来，再放入新的空间
			  大量字符串拼接时，效率低
		
		join
			'sep'.join(seq)
			上面的语法即：以sep作为分隔符，将seq所有的元素合并成一个新的字符串

		*加号连接效率低是在连续进行多个字符串连接的时候出现的，如果连接的个数较少，加号连接效率反而比join连接效率高


	字符串替换
		str.replace(old, new[, max])  返回新字符串
		参数：old -- 将被替换的子字符串。
     		new -- 新字符串，用于替换old子字符串。未找到就不替换
     		max -- 可选字符串, 替换不超过 max 次

	字符串查找
		find
			str.find(target, [start,end) )
			在字符串中查找指定字符串首次出现的index，找不到时返回-1
		index
			str.index(target, [start,end) )
			在字符串里查找子串第一次出现的位置,找不到子串会抛出异常

	字符串分割
		str.split(sep, [,max])
			将一个字符串分裂成多个字符串组成的列表
				不带参数时以空格进行分割
				带参数sep时，以该参数值为分隔符进行分割
				未查询到分隔符时，列表只包含原始字符串
				

	字符串大小写
		str.upper() --转大写
		str.lower() --转小写
		str.capitalize() --首字母大写，其余字母小写
		str.istitle() --是否是每个单词首字母都大写的
		str.isupper() --字母是否全是大写
		str.islower() --字母是否全是小写 

	字符串去空格	
		str.strip()  --去掉字符串的左右空格
		str.listrip() --去掉字符串的左边空格
		str.rstrip() --去掉字符串的右边空格

	其他
		str.isalnum() --是否全是字母或数字，并至少有一个字符
		str.isalpha() --是否全是字母，并至少有一个字符
		str.isdigit() --是否全是数字，并至少有一个字符
		str.isspace() --是否全是空白字符，并至少有一个字符
		str.count(target,[min,max))   --统计某个字符在字符串中出现的次数
		str.startswith(target)  --判断字符串是否以某个字符串开始
		str.endswith(target)  --判断字符串是否以某个字符串结尾


------------------------------------------8、输出与输入(AB 16:25-16:40)-------------------------------------------
输出	
	print()
		Python3.x时代，print是一个函数
			输出内容
				1. 字符串和数值类型
				2. 变量--无论什么类型，数值，布尔，列表，字典...都可以直接输出
			换行
				print语句默认的会在后面加上换行，加了逗号之后换行就变成了空格 

	print(1)
	print('')
	print(a)
	print(type())
	print([])
	print(())
	print({})


输入
	input
		变量名 = input(提示信息)
		将所有输入作为字符串看待

	举例：
		接收用户输入的一个字符串，判断是否为纯数字

	练习：	
		接收用户输入的一个数，判断能否被3整除


------------------------------------------9、控制语句(16:40-17:25)-------------------------------------------
分支语句
	有多种情况需要处理，根据不同的情况，代码执行不同的分支

		例子：接收用户输入的一个数，判断能否被3整除
		如果用户输入不是纯数字，怎么处理？
		如果能被3整除，输出什么？
	    如果不能被3整除，输出什么？
	    有没有其他情况？

	第一种：
		if 条件表达式:
	 		条件表达式为真时，执行此代码块

	 	if判断条件还可以简写，比如：
			if x:
				print('True')
			只要x是非零数值、非空字符串、非空list等，就判断为True，否则为False(None,0,空列表、元组、字典,'',False)

	第二种:
		if 条件表达式:
			条件表达式为真时，执行此代码块
		else:
			条件表达式为假时，执行此代码块
	第三种:
		if 条件表达式A:
			条件表达式为真时，执行此代码块
		elif 条件表达式B:
			条件表达式B为真时，执行此代码块
	第四种:
		if 条件表达式A:
			条件表达式为真时，执行此代码块
		elif 条件表达式B:
			条件表达式B为真时，执行此代码块
		elif 条件表达式C:
			条件表达式C为真时，执行此代码块
		else:
			以上表达式都为假时，执行此代码块

	注意：1.如果在某个判断上是True，把该判断对应的语句执行后，就忽略掉剩下的elif和else
		  2.Python中没有switch语句，所以多个条件时，可以用elif来实现
		  最容易出现的条件靠前写。

	复杂 if 条件  
	    可包含 and、or、not，用()标识计算优先级

    if 嵌套

		if xxx:
			xxxxxxxxxxxxxxxxxxxxx
			if xxx:
				xxx
			else:
				xxx
		else:
			xxxxxxxxxxxxxxxxxxxxx


	***练习：
		1.接受用户输入的一个字符串，如果是正整数, 就判断是否能同时被3和7整除

		2.根据输入的月份来输出，这个月有几天(默认2月有28天，不考虑闰年)，
		要求输出格式：xx月有xx天！

    ***作业：
		1.接收用户输入一个年份，判断是否是闰年(判断闰年的方法是该年能被4整除并且不能被100整除，或者是可以被400整除)
		2.某电信公司的市内通话费计算标准如下：三分钟内0.2元，
		  三分钟后每增加一分钟增加0.1元，不足一分钟的按一分
		  钟计算。要求编写程序，给定一个通话时间（单位：秒）
		  计算出应收费金额。
		3.接收用户输入一组整数，输入负数时结束输入，输出这组数字的和：格式--您输入的数字之和是：10
		4.某市的出租车计费标准为：3公里以内10元，3公里以后每0.5公里加收1元；每等待5分钟加收1元；
		超过15公里的加收原价的50%为空驶费。要求编写程序，对于任意给定的里程数（单位：公里）和等待时间（单位：秒）
		计算出应付车费