Day3 初识Python
摘要:Python的简介,种类,配置,pycharm的使用和配置,编码,变量,if语句,while循环
Python是由C语言开发而来的,C语言执行效率高,Python开发效率高
编程语言的演变:
- 机器码0101…
- 汇编语言
- C语言(程序员需要自己管理内存,容易奔溃,且类库很少,开发不便)
- Java,C#,PHP,Python(高级语言自身有虚拟机,可以管理内存)
高级编程语言:
- PHP的优势:快速地构建网站。但是其他的后台应用优势不如Python,后端前端都可以做
- Python的先天优势:Linux自带Python,类库很齐全
Python简介:
Python由Guido van Rossum开发,首次出现于1991年2月20日,现行稳定版本2.7.11和3.5.1
Python种类:
- CPython:Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上。
- JPython:Python的Java实现,Jython会将Python代码动态编译成Java字节码,然后在JVM上运行。
- IronPython:Python的C#实现,IronPython将Python代码编译成C#字节码,然后在CLR上运行。(与Jython类似)
- PyPy:Python实现的Python,将Python的字节码字节码再编译成机器码。
- RubyPython:....
一般情况下,主流提到的Python都是CPython
CPython:Python代码->字节码->机器码
PyPy:Python代码->机器码
所以PyPy的效率比CPython更高,忽略了字节码,直接转换成了机器码。
编码:
- ASCII码:计算机起初都使用ASCII码,但是并不能完全表示其他的语言,字符和符号,所以要使用万国码(Unicode)
- 万国码(unicode):最少两个字节(at least 2Byte):16 bit. 在万国码(Unicode)中,一个中文汉字用3个字节表示
- UTF-8码:Unicode并不是很完美,对其进行了压缩和划分,产生了utf-8, 英文8位(1个字节),欧洲字符16位(2个字节),东亚24位(3个字节),所以对于代码中可能出现中文或其他字符的需要加上-*- coding: utf-8 -*-
Python代码,文件头部格式:
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*-
- 第1句:实际在Linux中:#!/usr/bin python 为了兼容Unix所以写成#!/usr/bin/env python 在Linux中可以帮助找到解释器,之后可以用./file.py来执行相应的Python文件或者用python file.py来执行。如果无法调用的话,需要修改文件权限,在Linux terminal中输入类似于#chomod 755 file.py
- 第2句:使用utf-8编码,进而可以兼容更多的字符或符号(python2.7默认采用ASCII编码,需要加上这一句,python3.5默认采用utf-8,可以不加,但是为了统一就一律加上)
Python的安装与配置见Day1 Introduction。那么在Windows cmd中
- 使用python2.7:输入python27 file.py
- 使用python3.5:输入python35 file.py
- 使用#exit()退出解释器
Pycharm(python编译器)主要配置(Interpreter,文字大小,代码风格Dracula,模板,line number)
- Interpreter:安装pycharm结束后,会自动要求配置,将python2.7和python3.5的.exe文件路径添加进入即可。也可以在file--setting--project--Interpreter里面添加两个python的.exe文件作为两种解释器.
- 代码自动校对:如果使用2.7风格,就要在setting--project--Interpreter里选2.7,pycharm会自动验证代码是否符合2.7语法;如果使用3.5则设置为3.5即可
- 代码的运行:代码的运行也需要配合相应的编译器。对于当前代码文件,可以鼠标右击--run选项,或者点击右上角的绿色播放按钮。如果发现执行的时候并不是按所想的编译器2.7或3.5来执行的,可以在点击播放按钮附近的下拉框里选edit configuration,来选择这个文件的代码运行解释器
- python模板:在file--settings--editor--code style--file and code template里在python script里添加两行文件头
#!/usr/bin/env python # -*- coding:utf-8 -*-
可以在模板里再加几个空行,因为注释不能作为文件的唯一内容
pycharm中查看某类型的方法:
- 通过type(变量)找到变量类型,再输入变量类型,ctrl+左键单击之后就会看到该类型方法
- 直接打印dir(变量),python会自动显示出这个变量所属的类型的所有方法print(dir(变量))
- 更详细的信息,通过type找到了变量的类型,help(type(变量))就可以看到这个类型的详细介绍
- 对于阅读中不太理解的方法,可以ctrl+左键点击这个方法比如str.upper()就可以定位到该方法介绍
在pycharm中可以通过操作左边第一个和第三个键(show members)查看每个类下边的方法
行号:editor--general--appearance 里选择show line numbers可以显示行号
pycharm的使用:ctrl+?打注释/取消注释 alt+左键点击同时光标选中很多位置 tab缩进 shift+tab取消缩进
python的书写规范:
- 运算符号=/+...两边须有空格,
- 小括号的左边须有空格,反括号的右边须有空格
- 书写时逗号的后边须有空格
- 定义函数时,头部要有两个空行
- 写注释时,与代码同一行的,#左边空两格,右边空一格。注释单独一行的的,#右边空一格
- 变量和函数命名都为小写,可以加_来区分
Python中单行注释用#,多行注释用三引号""" """
Python引入类库:
Python提供了大量的类库,在安装目录下的Lib文件夹内可找到,运行代码时可以通过import 类库名 来引入类库,引入时不加.py的后缀。引入不仅限于Lib类库中的内容,在工作目录下也可以引入自己写的.py文件,引入之后相当于把file.py文件拿了过来,也会自动运行file.py文件。其内部定义的函数也可以用file.func()来调用。
使用python2.7执行的时候在import引入文件后会生成, 引入文件的.pyc文件,这是字节码文件,python3.5引入的时候不会生成这个字节码文件. 代码编译可以生成字节码,字节码反编译也可以得到代码
用户输入:等待用户输入在2.7中是raw_input(),在3.5中是input()
1 i1 = raw_input("Please input your username:") 2 i2 = raw_input("Please input your password:") 3 print(i1) 4 print(i2)
通过引入类库import getpass来隐匿密码输入的过程(并非是星号不可见,密码输入时也看不到输入)
1 import getpass 2 passwd = getpass.getpass("Please input your password")
用户输出:python2.7的输出print "Hello World" 在python3.5中是print("Hello World"), python2.7可以加括号也可以不加,python3.5需要加括号
引入类库sys,捕获执行python脚本时传入的参数, 就是file.py的路径,它捕获的是python27/35 E:/python/file.py后边的路径部分
1 import sys 2 print(sys.argv) # ['E:/python/buy.py']
变量
变量定义的规则:不用写var或类型名,直接写 变量名 = 值
-
变量名只能是 字母、数字或下划线的任意组合(不能有特殊符号如$)
-
Python的变量定义不像JavaScript用var直接写就可以i=123
-
变量名的第一个字符不能是数字
-
以下关键字不能声明为变量名
-
['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']
1 name1 = "aaa" 2 name2 = name1 3 print(id(name1)) # 458832163144 4 print(id(name2)) # 458832163144 5 name2 = name2[0] 6 print(name1) # aaa 7 print(id(name1)) # 458832163144 8 print(id(name2)) # 458828506536
变量name1定义后会指向内存的一个地址,将name2也指向了name1的地址,这样他们就可以都共用这个值aaa了。
为什么name2或者name1改变了,对另一个没有影响呢?
当你给name2或name1重新赋值之后或操作后,系统会给你重新分配一个内存地址,你们不再使用一个地址了,所以对另一方完全没有影响。所以不能认为name1或name2改变后另一个也会改变
方法id() 会获取到变量的内存地址
基本数据类型:
字符串类型str:字符串可以用+连接,但确保两边都是字符串类型,如果不是,可以用str()转换
1 str1 = "Hello World" 或 'Hello World' 2 str2 = "Hello" + "World" + " " + str(123)
数字类型int:
i = 123
布尔值
bool = True 或 bool = False
条件判断:if语句
1 if name == "alex": 2 print "超级管理员" 3 elif name == "eric": 4 print "普通管理员" 5 elif name == "tony" or name == "rain": 6 print "业务主管" 7 else: 8 print "普通用户"
注意:
-
If条件后必须有:冒号
-
Python不像其他语言有{}来结束代码块,用缩进来表示代码块,所以对于缩进有着严格,近乎变态地追求,如果缩进不一致,则不是一个代码块会报错
-
条件判断时,与用and &,或用or | pythong中没有的and和or已经是短路与和短路或了。对于and如果第一个为假就不去判断第二个,对于or如果第一个为真,就不去判断第二个了
- 赋值=,判断相等用==,不等于<>或!=
While循环:
1 while 条件: 2 3 # 循环体 4 5 # 如果条件为真,那么循环体则执行 6 # 如果条件为假,那么循环体不执行
while循环的定时器:
1 import time 2 while True: 3 print("1") 4 time.sleep(1)#this is a timer, the interval is 1s定时器,每秒执行一下
1 import time 2 i = 0 3 while True: 4 if i == 5: 5 break 6 print("1") 7 i += 1 8 time.sleep(1)#this is a timer, the interval is 1s
while:True的话,循环体内要有一个改变循环的条件,否则会形成死循环
break:break用于退出所有循环
1 计算1-2+3-4+5-6+....+99 2 i = 0 3 total = 0 4 while True: 5 if i == 100: 6 break 7 if i % 2 != 0: 8 total += i 9 else: 10 total -= i 11 i += 1 12 print total
continue:用于跳出当前循环,继续进行下一次循环
1 打印除7以外的10以内的整数 2 i = 1 3 while i <= 10: 4 if i == 7: 5 i += 1 #退出之前还是要让i+1 6 continue 7 print(i) 8 i += 1
1 三次登录机会 2 name = "wiesler" 3 time = 0 4 while True: 5 input1 = raw_input("please input username:") 6 if input1 == "wiesler": 7 print("Correct") 8 break 9 else: 10 time += 1 11 if time == 3: 12 print("You have tried 3 times, you are signed out") 13 break
浙公网安备 33010602011771号