第1章 Python基础 Day1 基本语法

1.1 编程语言介绍与分类

什么是编程语言?
	本质上跟人类语言,目的一样。 沟通
	电流+一堆硬件
	高电压1   低电压 0
	高电压1   低电压 0
	高电压1   低电压 0 8 晶体管

	0101010101010  play sound
	10100000     	open file

	机器语言 直接跟硬件打交道


	汇编语言  开发效率低
	0101010101010  <--- play_m


	高级语言
		对底层硬件的各种指令 做了封装
		play_music("忽然.mp3")

		人类代码  ——翻译———— 》机器语言

		根据翻译方式不同产生了2个流派

		编译型语言
			人类代码 ————》一次性把代码给 翻译官(编译器)————》汇编--》机器语言
			代表 : c,c++,golang
			优点:执行速度快
			缺点:跨平台可移植性差
				硬件  , cpu , 有自己指令规则  0000000001 打印, 1110000 play music
					intel ,amd : 复杂指令集 ,高性能高功耗
					ARM :精简指令集   手机  平板 , 低功耗

					你的基于intel平台编译出来的程序是没有办法在arm平台上运行


				软件,你的c程序想在windows,linux,mac同时可以运行,
					windows  invoke_window
					linux,mac  call_window


		解释型语言
			人类代码 ————》边执行边翻译(解释),陪同翻译(解释器/虚拟机) ————》机器语言
			代表:python,php,java,ruby,c#
			优点:跨平台好
			缺点:翻译需要时间,执行速度 慢

机器理解的慢, 1ms, 10ms
大多数情况下, 语言的快慢是我们人类感知不到的。

1.2 Python介绍、发展趋势

Python发展史
	Guido 龟叔 ,1989 Python
	2005 - 2012 谷歌大量使用PY,2013 dropbox
	2005 豆瓣 Python
	2009 用python ,
	2012 云计算,1000 = 1000 , Openstack Python
	2012 讲Python, 自动化开发, 不会开发的运维终将被淘汰。
	2014 AI兴起 ,
	2017 大众视野

1.3 Python环境安装

Windows
	mac
	Linux
	Unix

1.4 开发你的第一个Python程序

print("hello world!")

1.5 选择最好用的代码编辑器

PyCharm IDE

1.6 变量

y = 6 
	x =2
	print(x+y)  # 公式 调用
	>>8

	1. 先定义 变量, 存在内存里
	2. 代码后调用
修改

1.7 注释

# 当行注释
"""多行注释"""
'''多行注释'''

1.8 基本数据类型

str 'Alex' 	int 23
01001		010101

数字
	int 整数
		2**62
		type(age) 查看变量的数据类型
	long 无限大
	python3里,所有的整数都按int类型处理

	float浮点数 ~ 小数
		3.14159

	其它语言里必须在声明变量前先定义 好其类型,强类型

	弱类型语言

字符串

	定义
		name = "Alex" #有引号就是字符串,
		"I'm Alex"  'alex "sdds" '


	拼接

		>>> s1="我本将心照明月"
		>>> s2="无奈明月照沟渠"
		s1+s2
	段落/多行
		'''sdf
			sdfsdfdsf
		'''

bool 布尔
	a = 3
	b = 5

	b > a  正确/成立    真 True
	b < a  错误/不成立  假 False

	if today == raining True
		print(take unbrealla)
	else False
		print(不用带)


列表 , 数组
	Alex Egon OldVillageMaster  Peiqi BlackGirl
	>>> names
	['Alex', 'Egon', 'OldTownMaster', 'Peiqi', 'BlackGirl']
	>>> names[4]
	'BlackGirl'

	增
		插入
			>>> names.insert(4,"Alex")
			>>> names
			['Alex', 'Egon', 'OldTownMaster', 'Peiqi', 'Alex', 'BlackGirl']

		追加 , 把元素抛入列表最后面
			>>> names.append("小强")
			>>> names
			['Alex', 'Egon', 'OldTownMaster', 'Peiqi', 'Alex', 'BlackGirl', '小强']


	删
		>>> names[-1]
		'小强'
		>>> del names[-1]
		>>> names
		['Alex', 'Egon', 'OldTownMaster', 'Peiqi', 'Alex', 'BlackGirl']

	改
		>>> names
		['Alex', 'Egon', 'OldTownMaster', 'Peiqi', 'Alex', 'BlackGirl']
		>>> names[-1]
		'BlackGirl'
		>>> names[-1] = "黑姑娘"
		>>> names
		['Alex', 'Egon', 'OldTownMaster', 'Peiqi', 'Alex', '黑姑娘']
	查
		>>> names
		['Alex', 'Egon', 'OldTownMaster', 'Peiqi', 'Alex', '黑姑娘']
		>>>
		>>>
		>>> 'Peiqi' in names
		True
		>>> 'Peiqi2' in names
		False

		查到元素的下标并返回
		>>> names.index("Peiqi")
		3
		>>>
		>>>
		>>> names.index("Peiqi2")
		Traceback (most recent call last):
		  File "<stdin>", line 1, in <module>
		ValueError: 'Peiqi2' is not in list

	命令嵌套
		>>> del names[names.index("Peiqi")]
		>>> names
		['Alex', 'Egon', 'OldTownMaster', 'Alex', '黑姑娘']


dict , set
tuple

1.9 读取用户指令

input 方法 接收 到的所有数据 都以字符串的格式处理

1.10 格式化打印

%s 是代表字符串
  %d 整数
  %f 浮点

1.11 运算符

1.算术运算:+-*/ 加减乘除 %取模 **幂函数 //取整除
2.比较运算:== != > < >= <=
3.赋值运算:= += -= *= /= %= **= //=
4.逻辑运算:and or not

1.12 流程控制之if…else

单分支
	today_weather = "sun_day"

	#单分支
	if today_weather == "rain_day":
	    print("take your umbrella with you ")

双分支

	#双分支
	age_of_oldboy = 58
	if age_of_oldboy > 50 :
	    print("Too old, time to retire..")
	else:
	    print("还能折腾几年!")

缩进
	Python的缩进有以下几个原则:

	顶级代码必须顶行写,即如果一行代码本身不依赖于任何条件,那它必须不能进行任何缩进
	同一级别的代码,缩进必须一致
	官方建议缩进用4个空格

多分支


	再来个匹配成绩的小程序吧,成绩有ABCDE5个等级,与分数的对应关系如下


	A    90-100
	B    80-89
	C    60-79
	D    40-59
	E    0-39

	程序启动,提示用户输入分数,根据分数打印等级 。

	猜随机数

1.13 流程控制之while循环

break # 中止循环
continue # 中止本次循环,继续 下次循环
	count = 0
	while count < 100:
	    count += 1
	    if count > 10 and count < 20:
	        continue #
	    print(count)
dead loop

1.14 本章练习题&作业

双色球选购程序
三级菜单
股票查询

第一章总结:

1.主要是讲解了编程语言的分类,
    2.Python的发展史,发展趋势
    3.环境搭建
    4.变量、注释、
    5.基本数据类型:
        1.数字:int、float
        2.字符串:str
        3.布尔值:bool false or true
        4.列表:list 增删改查
    6.用户输入:input()函数
    7.运算符:
        1.算术运算:+-*/ 加减乘除 %取模 **幂函数 //取整除
        2.比较运算:== != > < >= <=
        3.赋值运算:= += -= *= /= %= **= //=
        4.逻辑运算:and or not
    8.流程控制:
        1.单分支if
        2.双分支if-else
        3.多分支if-elif-else
        4.while循环
        5.while-else循环

第二章 数据类型&文件操作

1.变量:

例1:name = 'old_boy'

身份运算:
    is 判断两个标识符是不是引用自一个对象
    例2:x is y ,类似id(x)==id(y),如果引用自同一个对象则返回true 否则false

    is not 判断两个标识符是不是引用自不同对象
    例:x is not y, 类似id(x)!=id(y).如果引用的不是同一个对象则返回true 否则false

空值None:
    代表什么都没有的意思。

三元运算:
    显的很NB的代码写法。
    name = "Eva"
    sex = None

    # 普通写法
    if name == "Eva":
        sex = "Female"
    else:
        sex = "Male"

    # 用三元运算来写
    sex = "Female" if name == "Eva" else "Male"

    a = b if b==0 else c

and、or、not的妙用:
    通过以上的对比逻辑运算的执行顺序  not > and > or

2.二进制

首先,计算机一共就能做两件事:计算和通信

二进制的定义:
    二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则
    是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基
    本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,
    用“开”来表示1,“关”来表示0。
    我们发现刚刚我们讲述的狼烟的故事和现在这个新理论出奇相似。假设狼烟点燃用1表示,狼烟灭掉用0表示,那么
    刚刚我们用狼烟表示百万雄师的理论就可以用在计算机上,这种表示数字的方式就叫做二进制。
    你可能会觉得发明计算机的人思路轻奇,为什么要多此一举的用这种方式来表达数字,但事实上计算机不像我们
    这样智能,CPU是一个包含上百万个精巧的晶体管的芯片集合,晶体管表达感情的方式很简单,就是通过高低电压
    (有电没电),低电压的时候表示0,高电压的时候表示1,因此最终能让计算机理解的就只有0和1而已。

二进制和十进制转换:
    其实刚刚在无形中我们已经将10进制转换成2进制了,现在我们要再总结一遍。
    刚才我们已经发现,二进制的第n位代表的十进制值都刚好遵循着2的n次方这个规律

填位大法:
    先把他们代表的值依次写出来,然后再根据10进制的值把数填到相应位置,就好了~~~
    十进制转二进制方法相同,只要对照二进制为1的那一位对应的十进制值相加就可以了。

3.字符编码

ASCII:
    ASCII(American Standard Code for Information Interchange,
    美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代
    英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。
    由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英
    文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母 A的编码是65,小
    写字母 z的编码是122。后128个称为扩展ASCII码。
    那现在我们就知道了上面的字母符号和数字对应的表是早就存在的。那么根据现在有的一些
    十进制,我们就可以转换成二进制的编码串。

大小换算:
    bit           位,计算机中最小的表示单位
    8bit = 1bytes 字节,最小的存储单位,1bytes缩写为1B
    1KB=1024B
    1MB=1024KB
    1GB=1024MB
    1TB=1024GB
    1PB=1024TB
    1EB=1024PB
    1ZB=1024EB
    1YB=1024ZB
    1BB=1024YB

GBK和GB2312
    显然,对于我们来说能在计算机中显示中文字符是至关重要的,然而刚学习的ASCII表里连
    一个偏旁部首也没有。所以我们还需要一张关于中文和数字对应的关系表。之前我们已经看
    到了,一个字节只能最多表示256个字符,要处理中文显然一个字节是不够的,所以我们需
    要采用两个字节来表示,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,
    用来把中文编进去。

Unicode
    因此,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
    Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,
    就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。
    现在,捋一捋ASCII编码和Unicode编码的区别:
    ASCII编码是1个字节,而Unicode编码通常是2个字节。
    字母A用ASCII编码是十进制的65,二进制的01000001;
    字符0用ASCII编码是十进制的48,二进制的00110000;
    汉字“中”已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101。
    你可以猜测,如果把ASCII编码的A用Unicode编码,只需要在前面补0就可以,因此,A的Unicode编码
    是00000000 01000001。

UTF-8....

4.数据类型-列表:

定义:[]内以逗号分隔,按照索引,存放各种数据类型,每个位置代表一个元素。

列表的增删改查:
增:
    追加:names.append("rain")
    插入:names.insert(2,"黑姑娘")
    合并:names.extend(n2)
    嵌套:names.insert(2,[1,2,3])
删:
    del 直接删: del names[2]
    pop 删:names.pop(1)  #删除指定元素
    clear 清空:n2.clear()
改:
    names[0] = "金角大王"
查:
    names.index("eva") #返回从左开始匹配到的第一个eva的索引
    names.count("eva") #返回eva的个数
    切片:names[1:4]  #不包含下标4的元素
    倒着切:names[-5:-1]
    步长:a[::3] #按步长3打印列表,第1个:是省略掉的start:end
    列表反转:a[::-1] #通过把步长设置成负值,可达到列表返转的效果

排序:
    a.sort()

反转:
    names.reverse()

5.数据类型-元组:

定义:与列表类似,只不过[]改成()
特性:
  1.可存放多个值
  2.不可变
  3._按照从左到右的顺序定义元组元素,下标从0开始顺序访问,有序
创建:
    ages = tuple((11, 22, 33, 44, 55))

6.数据类型-字符串:

字符串是一个有序的字符的集合,用于存储和表示基本的文本信息,
 ’ ‘或’’ ‘’或’’’ ‘’’中间包含的内容称之为字符串

 特性:
 1.按照从左到右的顺序定义字符集合,下标从0开始顺序访问,有序
 2.可以进行切片操作
 3.不可变,字符串是不可变的,不能像列表一样修改其中某个元素,所有对字符串的
   修改操作其实都是相当于生成了一份新数据。

 补充:
 1.字符串的单引号和双引号都无法取消特殊字符的含义,如果想让引号内所有字符均
 取消特殊意义,在引号前面加r,如name=r’l\thf’

 创建:
      s = 'Hello,Eva!How are you?'

7. 数据类型-字典:

定义:{key1:value1,key2:value2}
1.键与值用冒号":"分开;
2.项与项用逗号","分开;
info = {"name":"小猿圈","age":18}
创建
person = dict(name='server', age=20)
增
info["佩奇"] = [26,"讲师",400]  --- 还有  setdefault("server", [1,2,3])
删
del info["name"]  删除指定的key,同pop方法
info.pop("佩奇")  删除指定key
info.popitem()   随便删除一个key
info.clear()     清空dict
改
info["name"]="new_data" 如果key在字典中存在,"new_data"将会替代原来的value值
dic.update(dic2)        将字典dic2的键值对添加到字典dic中
查
info['key']

8.数据类型-集合:

定义:set()  去重

增:
    a.add('黑姑娘')
删:
    a.discard('rain')   #删除一个存在的值
    a.pop() #删除并返回
    a.remove(4)
改:
    呵呵,不能改。。。
查:
    'alex' in a

9.hash是什么东西:

hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)
通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散
列值的空间通常远小于输入的空间

哈希算法不过是一个更为复杂的运算,它的输入可以是字符串,可以是数据,可以是任何文件,经
过哈希运算后,变成一个固定长度的输出,该输出就是哈希值。但是哈希算法有一个很大的特点,
就是你不能从结果推算出输入,所以又称为不可逆的算法

哈希的用途:
    1.密码,我们日常使用的各种电子密码本质上都是基于hash的,你不用担心支付宝的工作人员
    会把你的密码泄漏给第三方,因为你的登录密码是先经过 hash+各种复杂算法得出密文后
    再存进支付宝的数据库里的

    2.文件完整性校验,通过对文件进行hash,得出一段hash值 ,这样文件内容以后被修改了,
    hash值就会变。 MD5 Hash算法的”数字指纹”特性,使它成为应用最广泛的一种文件完整性校
    验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。

    3.数字签名,数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收
    者只有用发送者的公钥才能解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要
    信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,
    否则说明信息被修改过,因此数字签名能够验证信息的完整性。

此外,hash算法在区块链领域也使用广泛。

10.用Python操作文件:

占硬盘方式的文件修改代码示例
f_name = "兼职白领学生空姐模特护士联系方式.txt"
f_new_name = "%s.new" % f_name
old_str = "刘诺涵"
new_str = "[黑姑娘]"
f = open(f_name,'r')
f_new = open(f_new_name,'w')
for line in f:
    if old_str in line:
        new_line = line.replace(old_str,new_str)
    else:
        new_line = line
    f_new.write(new_line)
f.close()
f_new.close()

上面的代码,会生成一个修改后的新文件 ,原文件不动,若想覆盖原文件

import os
f_name = "兼职白领学生空姐模特护士联系方式.txt"
f_new_name = "%s.new" % f_name
old_str = "刘诺涵"
new_str = "[黑姑娘]"
f = open(f_name,'r')
f_new = open(f_new_name,'w')
for line in f:
    if old_str in line:
        new_line = line.replace(old_str,new_str)
    else:
        new_line = line
    f_new.write(new_line)
f.close()
f_new.close()
#把新文件名字改成原文件 的名字,就把之前的覆盖掉了,windows使用os.replace
# 帮助文档说明replace会覆盖原文件
os.rename(f_new_name,f_name)

第二章总结:

1.变量的创建:赋值和修改、内存地址的指向
2.身份运算:三元运算
3.列表:增删改查、切片、反转、插入、步长、遍历、排序
4.元组:增删改查:呵呵  不能改 元组不可变
5.字符串:切片、字母大小写、替换、查找
6.字典:增删改查、长度、循环字典
7.集合:交集并集、去重、增删改查、关系运算
8.二进制、十进制、十六进制:相互转换
9.字符编码
10.hash算法
11.操作文件:
    open()
    with open() as e
    write()
    read()
    close()
    r r+ w w+ a a+