Week 1
1 python的介绍
python的创始人为吉多·范罗苏姆(Guido van Rossum)。
python不仅是一门脚本语言。
1.1 语言的分类
1.1.1 编译语言VS解释语言
(1)编译(Compile):源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序。
复杂的程序将代码分散在各个源文件中,作为不同的模块来组织。编译各个文件时就会生成目标文件(Object file)。一般一个源文件的编译都会对应一个目标文件。这些目标文件基本上已经是可执行代码,但由于只是整个项目的一部分,所以还不能直接运行。待所有的源文件的编译完成,由链接程序(Linker)将目标文件“打包”成一个可执行文件。
(2)解释:只在执行程序时,才源代码解释成机器语言给计算机来执行。
可移植性:程序不用改动就可以在移植了解释器的系统上运行。
打个比方:假如你打算阅读一本外文书,而你不知道这门外语,那么你可以找一名翻译,给他足够的时间让他从头到尾把整本书翻译好,然后把书的母语版交给你阅读;或者,你也立刻让这名翻译辅助你阅读,让他一句一句给你翻译,如果你想往回看某个章节,他也得重新给你翻译。
解释语言是说解释执行的语言,但执行的代码并不一定是文本格式的。脚本语言的程序是文本文件,并且是解释执行的。
1.1.2 动态语言VS静态语言
(1)动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言。在用动态类型的语言编程时,不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言。
(2)静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型。C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。
1.1.3 强类型定义语言VS弱类型定义语言
(1)强类型定义语言:强制数据类型定义的语言。一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。
(2)弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反,一个变量可以赋不同数据类型的值。
结论:python是一门动态解释性的强类型定义语言。
1.2 .pyc是什么鬼
随着Java等基于虚拟机的语言的兴起,我们又不能把语言纯粹地分成解释型和编译型这两种。
用Java来举例,在执行之前已经预先进行一次预编译,生成的代码是介于机器码和Java源代码之间的中介代码,运行的时候则由JVM(Java的虚拟机平台,可视为解释器)解释执行。所以我们说Java是一种先编译后解释的语言。
Python也是一门先编译后解释的语言。
1.2.1 python的运行过程
PyCodeObject则是Python编译器真正编译成的结果。pyc文件其实是PyCodeObject的一种持久化保存方式。
当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。
当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件(源代码不存在更新),如果找到则直接载入,否则就重复上面的过程。
1. 首先需要知道,只有在import导入py文件时,才会产生pyc字节码文件,该字节码文件是可以代替源文件而直接执行的
2. 但每次执行py文件,产生的字节码并不会保留下来,也就是说,每次执行py文件,都是要重新经历一遍:py文件->字节码->python解释器->机器码,每次都是一个重新解释执行的过程。
1.3 python解释器
运行代码需要Python解释器去执行包含Python代码的以.py
为扩展名的文本文件。
Cpython(最常用) Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上。
PyPy(特殊)
*PyPy*和CPython很像的实现,解释器本身就是由Python写成。CPython会把代码转化成字节码,PyPy会把代码转化成机器码。
Jyhton
Python的Java实现,Jython使用了JIT技术,将Python代码动态编译成Java字节码(不是java源代码),然后在JVM上运行。
IronPython
Python的C#实现,IronPython将Python代码编译成C#字节码,然后在CLR上运行。(与Jython类似,可以使用在.NET 和 Mono平台的解释器)
1.4 python安装
1.4.1 windows
多版本共存:
1、下载安装包 https://www.python.org/downloads/ 下载windows版本的python2和python3 2、安装 默认安装路径:C:python 安装完python2后,打开安装路径,把python.exe执行文件改名为python2.exe 3、配置环境变量 添加环境变量:此电脑--属性--高级系统设置--高级--环境变量--系统变量--Path--编辑(Python安装目录) 4、是否安装成功 打开终端,在终端中输入分别python2和python测试是否成功
1.4.2 linux
1、linux自带python 查看版本:python -V 2、linux下Python版本更新至最新 安装gcc,用于编译python源码:yum install gcc 下载并解压源码包:https://www.python.org/ftp/python/ cd /opt wget --no-check-certificate https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tar.xz tar xf Python-2.7.9.tar.xz cd Python-2.7.9 编译安装python2.7.9 ./configure make all make install /usr/bin/python2.7 -V 修改默认python版本 mv /usr/bin/python /usr/bin/python2.6 ln -s /usr/local/bin/python2.7 /usr/bin/python python -V
指定解释器
将头文件#!/usr/bin/python 改为#!/usr/bin/python2.6 或 #!/usr/bin/env python
2 字节编码
python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ASCII)
ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 = 256-1
而后设计了用于简体中文的GB2312(1980年)一共收录了7445个字符,GB2312 支持的汉字太少,1995年的汉字扩展规范GBK1.0收录了21886个符号。2000年的 GB18030是取代GBK1.0的正式国家标准,该标准收录了27484个汉字。
显然ASCII码无法将世界上的各种文字和符号全部表示,所以,就需要新出一种可以代表所有字符和符号的编码,即:Unicode
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。
UTF-8,是对Unicode编码的压缩和优化,他不再使用最少使用2个字节,而是将所有的字符和符号进行分类:ASCII码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存。
使用python输出中文需要声明:# -*- coding: utf-8 -*-
3 第一个python程序
3.1 方式一:交互式编程
交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码。
linux上你只需要在命令行中输入 Python 命令即可启动交互式编程,如下:
$ python Python 2.7.6 (default, Sep 9 2014, 15:04:36) [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>>
Window上在安装Python时已经已经安装了默认的交互式编程客户端,在命令行执行python后,输入以下文本信息,然后按 Enter 键查看运行效果:
>>> print ("Hello, Python!")
3.2 方式二:脚本式编程
把python代码保存在后缀名为.py的文件中,通过脚本参数调用解释器开始执行执行.py文件。
eg.在该文件目录下执行命令python hello.py,可以看到同样会输出Hello,Python!
或者回到文件所在的文件夹中,按住Shift+鼠标右键,选择在此处打开命令窗口,执行命令python hello.py。
3.3 方式三:指定解释器
另一种方式来执行Python脚本。修改test.py文件,如下所示:
#!/usr/bin/python print "Hello, Python!";
假定您的Python解释器在/usr/bin目录中,使用以下命令执行脚本:
$ chmod +x test.py # 脚本文件添加可执行权限 $./test.py
输出结果:
Hello, Python!
这里可以使用PyCharm。PyCharm是一种Python IDE。
4 变量与内存管理
4.1 什么是变量?为何要有变量?
答:程序当中,变量是计量某种状态的。变量是反映变化的过程,在变化的过程中记录某种状态。
name = "zhouxy"
上述代码声明了一个变量,变量名为(标识符): name,“=” :赋值符号,变量name的值为:"zhouxy"。
4.2 标识符命名规范
- 变量名不能太长且要有意义,不能是中文或拼音。
- 变量名只能是字母、数字、下划线的任意组合。
- 变量名的首字符不能是数字
- 关键字不能声明为变量名:
[‘and‘, ‘as‘, ‘assert‘, ‘break‘, ‘class‘, ‘continue‘, ‘def‘, ‘del‘, ‘elif‘, ‘else‘, ‘except‘, ‘exec‘, ‘finally‘, ‘for‘, ‘from‘, ‘global‘, ‘if‘, ‘import‘, ‘in‘, ‘is‘, ‘lambda‘, ‘not‘, ‘or‘, ‘pass‘, ‘print‘, ‘raise‘, ‘return‘, ‘try‘, ‘while‘, ‘with‘, ‘yield‘]
4.3 定义变量的方式
驼峰体和下划线方式。建议使用下划线方式。
4.4 变量的赋值与修改
name = "zhouxy" name2 = name print(name,name2) name = "xyzhou" print("What is the value of name2 now?")
4.5 注释
当行注视:# 被注释内容
多行注释:''' 被注释内容 '''
5 输入输出
5.1 输入
在python3中的输入的命令是input,在python2中的输入命令是raw_input。
5.2 输出
5.2.1 print
在python3中,print必须加上括号。python2中则可以不加括号。
5.2.2 getpass:非明文方式显示(在Pycharm下无效)
需要导入getpass模块
# 非明文方式显示 import getpass username = input("用户名:") password = getpass.getpass("密码:") print(username) print(password)
5.2.3 占位符:%s
username = input("username:") password = int(input("password:")) # int()强制转换输入类型,默认为字符串 print("用户名:%s"%(username)) # 占位符 :%d(数字)%f (浮点) print("密码:%d"%(password))
name = input("Please enter your username : ") # type()可以接收任何东西作为参数――并返回它的数据类型。整型、字符串、列表、字典、元组、函数、类、模块,甚至类型对象都可以作为参数被type函数接受。 print(type(name)) age = int(input("Please enter your age : ")) print(type(age))
当我们需要使用int类型的值时需要 用int()这个方法将str强制转换成int类型。
当然也是可以str()转换成str类型的,float()转换成float(浮点型),hex()可以将值转换成16进制,long()把字符串和数子转换成长整数
list()函数可将序列对象转换成列表,oct()函数可把给出的整数转换成八进制数,ord()函数返回一个字符串参数的ASCII码或Unicode值、格式
username = input("username:") password = int(input("password:")) info = ''' 用户名:%s 密码:%d '''%(username,password) print(info)
5.2.4 .format
username = input("username:") password = int(input("password:")) info = ''' 用户名:{name} 密码:{pwd} '''.format(name=username,pwd=password) print(info)
username = input("username:") password = int(input("password:")) info = ''' 用户名:{0} 密码:{1} 重复密码:{1} '''.format(username,password) print(info)
6 模块简介
python模块包括标准模块和第三方模块(安装模块)。
6.1 sys
import sys print(sys.path) #打印环境变量 print(sys.argv) #打印相对路径,在PyCharm中打印绝对路径
可以输入脚本所需参数,如下图所示:
可以取传入参数值,如下图所示:
print(sys.argv[2])
6.2 os
import os os.system("dir") # 查看所在文件目录 cmd_res1 = os.system("dir") # 只执行命令,不保存结果 cmd_res2 = os.popen("dir") # 打印内存地址 cmd_res3 = os.popen("dir").read() print(cmd_res1,cmd_res2,cmd_res3) os.mkdir("new") # 新建一个文件
自己写的模块只能在当前目录下导入,如果要在全系统都使用,就要把模块放到python全局环境变量目录里,一般都放在site-packagees目录下,也可以修改环境变量路径。
7 数据类型
7.1 数字
int(整型)
在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1。
long(长整型)
跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,但实际上由于机器内存有限,我们使用的长整数数值不可能无限大。
Python2如果整数发生溢出,会自动将整数数据转换为长整数,Python3如果整数发生溢出,数据类型仍为整型。
float(浮点型)
3.23和52.3E-4是浮点数的例子。E标记表示10的幂。在这里,52.3E-4表示52.3 * 10-4。
complex(复数)
7.2 布尔值
7.3 字符串
"hello world"
字符串拼接:>>> name + age #相加其实就是简单拼接
注意,字符串的拼接只能是双方都是字符串,不能跟数字或其它类型拼接
7.4 列表
name_list = ['zhouxy', 'seven', 'female'] 或 name_list = list(['zhouxy', 'seven', 'famale'])
7.5 元组
person = {"name": "zhouxy", 'age': 18} 或 person = dict({"name": "zhouxy", 'age': 18})
8 流程控制
8.1 表达式if...else
8.1.1 用户登录认证
# 提示输入用户名和密码 # 验证用户名和密码 # 如果错误,则输出用户名或密码错误 # 如果成功,则输出欢迎,XXX! _username = "zhouxy" _password = 123456 username = input("用户名:") password = int(input("密码:")) if _username != username or _password != password: print("用户名或密码错误") else : print("欢迎,",username)
8.1.2 猜年龄
在程序里设定好你的年龄,然后启动程序让用户猜测,用户输入后,根据他的输入提示用户输入的是否正确,如果错误,提示是猜大了还是小了。
age_of_me = '24' age = input("我的年龄?") if age_of_me == age : print("猜对了!") elif age_of_me > age : print("猜小了!") else : print("猜大了!")
8.2 表达式whlile循环
8.2.1 猜年龄V2.0
实现让用户不断的猜年龄,但只给最多3次机会,再猜不对就退出程序,猜对也退出程序。
age_of_me = 24 count = 1 while count < 4 : age = int(input("我的年龄?")) count += 1 if age_of_me == age : print("猜对了!") break elif age_of_me > age : print("猜小了!") else : print("猜大了!") else : print("笨蛋!")
8.3 表达式for循环
for i in range(10): print("loop:", i )
i:临时变量
8.3.1 break
for i in range(10): if i>5: break #不往下走,直接跳出整个loop print("loop:", i )
8.3.2 continue
for i in range(10): if i<5: continue #不往下走,直接进入下一次loop print("loop:", i )
可以debug来看代码运行,而对于break和continue的理解,break是打校长,就不用上课了,continue是打老师,只不过当天不用上课,后面还得上课!
9 数据运算
9.1 算数运算
9.2 比较运算
9.3 赋值运算
9.4 逻辑运算
and注解:
- 在Python 中,and 和 or 执行布尔逻辑演算,如你所期待的一样,但是它们并不返回布尔值;而是,返回它们实际进行比较的值之一。
- 在布尔上下文中从左到右演算表达式的值,如果布尔上下文中的所有值都为真,那么 and 返回最后一个值。
- 如果布尔上下文中的某个值为假,则 and 返回第一个假值
or注解:
- 使用 or 时,在布尔上下文中从左到右演算值,就像 and 一样。如果有一个值为真,or 立刻返回该值
- 如果所有的值都为假,or 返回最后一个假值
- 注意 or 在布尔上下文中会一直进行表达式演算直到找到第一个真值,然后就会忽略剩余的比较值
and-or结合使用:
- 结合了前面的两种语法,推理即可。
- 为加强程序可读性,最好与括号连用,例如:
(1 and 'x') or 'y'
9.5 位运算
9.6 成员运算
9.7 身份运算
9.8 运算符优先级:自上而下,优先级从高到低
10 homework1
-
用户输入帐号密码进行登陆
-
用户信息保存在文件内
-
用户密码输入错误三次后锁定用户
# Author:zhouxy import os import sys # 定义登录黑白名单列表 pass_list = open("pass.txt","r") # 预先填写,格式为姓名:密码 black_list = open ("black.txt","r") # 定义空列表 name_list = [] clock_list =[] name_dict = {} # 定义变量 count = 0 _count = 2 #将白名单中的信息读取,存储到列表中 for i in pass_list: name,password = i.strip(' ').split(':') name_list.append(name) name_dict[name] = password pass_list.close() #将黑名单的信息读取,存储到列表中 for i in black_list: clock_list.append(i.strip(' ')) black_list.close() username = input("请输入用户名:") if not username: print("用户名不能为空") elif username in clock_list: print ("抱歉,用户名已被锁定QAQ") sys.exit() else: if username in name_dict: for count in range(10): if count < 3: passwd = input("请输入用户密码:") if not passwd: print("用户密码不能为空") elif passwd == name_dict[username]: print ("欢迎".center(40,'-')) break else: print ("密码错误,还剩下%s机会"%(_count)) count +=1 _count -=1 continue if count > 3: print ("用户名已被锁定") f = open('black.txt','a') f.write(username + ' ') f.close() sys.exit() else: print ("用户未注册") sys.exit()