一、关于python的一些介绍
1、了解编译型与解释型语言
(此区别可理解为从源程序到程序运行过程来看)
编译:将源程序翻译成可执行的目标代码,翻译与执行是分开的。
解释:对源程序的翻译与执行一次性完成,不生成可存储的目标代码。
上述只是表象,二者背后的最大区别是:对解释执行而言,程序运行时的控制权在解释器而不在用户程序;对编译执行而言,运行时的控制权在用户程序。
举个例子:
假如你打算阅读一本外文书,而你不知道这门外语,那么你可以找一名翻译,给他足够的时间让他从头到尾把整本书翻译好,然后把书的母语版交给你阅读;或者,你也立刻让这名翻译辅助你阅读,让他一句一句给你翻译,如果你想往回看某个章节,他也得重新给你翻译。
2、了解动态语言和静态语言
(此区别可理解为从数据类型来看)
动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言。
静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的。
用动态类型的语言编程:
永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby、VBScript属于动态类型语言。
用静态类型的语言编程:
在写程序时要声明所有变量的数据类型。C、C++、C#、JAVA等语言属于静态类型语言。
3、了解强类型定义语言和弱类型定义语言
强类型定义语言:强制数据类型定义的语言。一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。
举个例子:
如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。
弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。
强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。
另外,“这门语言是不是动态语言”与“这门语言是否类型安全”之间是完全没有联系的!
python是一门动态解释性的强类型定义语言。
4、了解python的解释器
我们编写Python代码,写的是一个包含Python代码的以.py为扩展名的文本文件。要运行代码,就需要Python解释器去执行.py文件。常用的python解释器为cpython、除此外还有ipython、pypy等。
CPython:当我们从Python官方网站下载并安装好Python 2.7后,我们就直接获得了一个官方版本的解释器:CPython。这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器。CPython是使用最广的Python解释器。教程的所有代码也都在CPython下执行。
5、了解python2与python3的区别
此处不做深究,只要知道现在流行有两种python版本:分别为python2.x及python3.x即可。后续的编程大部分情况下都是在python3.x版本下进行。
二、Python3.7的安装过程
1、安装包的下载
登录python官网 https://www.python.org/downloads/ 在相应的界面选择版本下载。此处我们选择下载gzip的源码包在linux系统中安装。
2、上传安装包
使用rz将安装包放到linux系统的相应目录下,此处不展开说明如何使用rz。
3、安装GCC
安装gcc建议的操作为使用yun groupinstall 安装开发工具(development tools)来安装GCC。
先使用yum grouplist查看系统中是否安装了GCC(阿里提供的一个yum源,http://mirrors.aliyun.com/help/centos)
使用yum groupinstall指令来安装Development Tools
通过上述步骤,GCC已经安装完成。
4、解压及预配
加压上传进linux的tgz包,使用指令tar -zxvf ,进入文件夹执行configure文件配置安装的目录./configure --prefix=/usr/local/python3.6.3
5、编译及安装
./执行完成后,使用make&make install来编译安装,编译过程会调用gcc。
在安装过程中经常会出现报错,如此处就报错没有zlib,需要我们安装zlib。
没有zlib那就安装zlib,使用yum install zlib* -y 。注意yum源中存在对zlib版本的情况(建议用光盘的yum 源进行安装,如果配置了一些网络yum源建议先去掉yum配置文件,之后yum clean all)
安装完成后,再make&make install 编译安装即可完成。
注:如果存在多个版本zlib导致安装过程中报错使用yum install -y zlib zlib-devel --setopt=protected_multilib=false来安装。
注:在python3.6中不能使用方向键会出现乱码的情况,需要安装yum -y install readline-devel,然后再重新编译python即可解决。
6、添加环境变量
vi cat /etc/profile PATH=/usr/local/python3.6.3/bin:$PATH export PATH ----------------- #或者做一个软连接连接这个python3 ln -s /usr/python/bin/python3 /usr/bin/python3
三、HELLO WORLD与变量
1、第一个python程序,HELLO WORLD
1 #!/bin/env python3.6 2 print("Hello python") 3 print('Hello python') 4 print('"Hello python"') 5 print("'Hello python'")
-----------------------------------
Hello python
Hello python
"Hello python"
'Hello python
#!的作用:在linux系统中如果需要用./来执行此py程序的话,系统默认使用bash来执行。bash解释器执行的是shell脚本,并不能执行python程序。所以此处需要用#!告诉系统在./运行该程序的时候使用什么解释器。我们需要使用cpython解释器来解释我们写的代码,所以此处写上我们cpython解释器的位置。(使用which指令可以查看指令的完整位置,可以使用/bin/env python或/bin/env bash来指定解释器)
hello world的程序的注意点:单引号与双引号的使用并不影响输出效果,单引号和双引号的结合使用,用来输出需求的符号。
2、变量
变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。
变量的使用方式:变量名=赋值
1 #!/bin/env python3.6 2 name1 = "Zhang San" 3 name2 = name1 4 name1 = "Li Si" 5 print("name1 is",name1,"name2 is",name2)
-----------------------------------------------
name1 is Li Si name2 is Zhang San
该程序的注意点:此程序中有两个变量,分别是name1、name2,需要捋清楚的关系是name1 -赋值-> name2后,修改了name1的内容,此时对name2并没有影响。
变量定义的规则:
- 变量名只能是字母、数字或下划线的任意组合,_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'
变量命名的规范:
- python中没有常亮的概念,所以如果定义了一个变量,希望这个变量被用作常量,在下文的代码中不去进行修改时,我们常用全大写字母的方式来表示此变量为常量,如:CHANGLIANG=10010
- 写变量名要明确,一眼就能明白这个变量要用来做什么,常用下划线和驼峰写法来明确表示变量名,如:Tom_name、TomAge、TomSchool
四、字符编码与代码注释的方法
1、字符编码的发展
ascill 255 8位 1bytes
->1980 gb2312 7xxx汉字
->1995 GBK1.0 2w+汉字
->2000 GB18030 27xxx汉字
-> unicode 2bytes 万国码、统一码,单一码
->utf-8 en:1bytes, zh:3bytes
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生
2、两种注释方式
行注释: #注释的内容
批量注释及引用 """注释的内容"""/'''注释的内容'''
#!/usr/local/python3.6.3/bin/python3.6
#_*_coding:utf-8_*_ username = input("username:") password = input("your password:") #imput的使用方法 text=""" 使用三个单引号或双引号能注释,很多行 用双引号 不仅能注释 还能给变量赋值 """ text2=''' 单引号也可以的 '''
--------------------------------
username:yomi
your password:123
yomi 123
使用三个单引号或双引号能注释,很多行
听说
用双引号
不仅能注释
还能给变量赋值
单引号也可以的
3、#_*_coding:utf-8_*
python解释器在加载 .py 文件中的代码时,会对内容进行编码,
Python2 默认将变量转换成ascill编码,python3默认将变量转换为unicode编码,由于ascill无法表示中文,所以会出现报错,故python2在运行带中文字符的py文件的时候需要加上#_*_coding:utf-8_*_ ,来告诉python解释器,编译为utf-8的格式。
五、用户交互程序(input、getpass)
1、input的使用
格式:name = input("name:")
2、getpass的使用
使用getpass时需要先导入getpass模块
格式:import getpass
password = getpass.getpass("password:")
3、字符串拼接的多种写法
方法一、逗号写法
print("name1 is",name1,"name2 is",name2)
方法二、加号写法
1 text = """ 2 -------- information of """ +name+"""-------- 3 age is"""+age+""" 4 level is """+level 5 6 print(text)
方法三、百分号写法
1 infor=""" 2 ----information of %s ---- 3 name is %s 4 age is %s 5 salary is %s 6 """%(name,name,age,salary) #直接写不予要有逗号 7 print(infor)
----------------------------------------
%s,用来输出一个字符串
%d,用来输出十进制整数
方法四、花括号定义变量写法
text2=""" ---imformation of {_name}--- #注意不能用中括号 name is {_name} age is {_age} salary is {_salary} """.format(_name=name,_age=age,_salary=salary) print(text2)
方法五、花括号数字写法
1 text3=""" 2 ---imformation of {0}--- #引号中用井号并不能起到注释作用,就像现在这样 3 name is {0} 4 age is {1} 5 salary is {2} 6 """.format(name,age,salary) 7 print(text3)
一段综合
1 import getpass 2 name = input("your name:") 3 age = int(input("your age:")) #定义整形 4 salary = getpass.getpass("input your salary:") 5 print ("age参数的类型为:",type(age),"salary参数的类型为:",type(salary)) 6 salary = int(salary) 7 print ("age参数的类型为:",type(age),"salary参数的类型为:",type(salary)) 8 text=""" 9 ---imformation of %s--- 10 name is %s 11 age is %d 12 salary is %d 13 """%(name,name,age,int(salary)) 14 print(text) 15 text2=""" 16 ---imformation of {_name}--- #注意不能用中括号 17 name is {_name} 18 age is {_age} 19 salary is {_salary} 20 """.format(_name=name,_age=age,_salary=salary) 21 print(text2) 22 text3=""" 23 ---imformation of {0}--- #引号中用井号并不能起到注释作用,就像现在这样 24 name is {0} 25 age is {1}yomi 26 salary is {2} 27 """.format(name,age,salary) 28 print(text3)
----------------------------------------------------
your name:yomi
your age:25
salary:
age参数的类型为: <class 'int'> salary参数的类型为: <class 'str'>
age参数的类型为: <class 'int'> salary参数的类型为: <class 'int'>
---imformation of yomi---
name is yomi
age is 25
salary is 50000
---imformation of yomi--- #注意不能用中括号
name is yomi
age is 25
salary is 50000
---imformation of yomi--- #引号中用井号并不能起到注释作用,就像现在这样
name is yomi
age is 25
salary is 50000
该程序的注意点:getpass指令在windows环境中使用由问题。需要在linux环境中使用。
六、判断与循环
1、if判断
1 if your_number == REALLY_NUM: 2 print("so good!") 3 elif your_number > REALLY_NUM: 4 print("think bigger") 5 else : 6 print("think smaller")
该程序的注意点:if...elif...elif...else 可以写很多层的elif,后面可以接else。
2、while 循环
1 count=0 2 REALLY_NUM = int("100") 3 while count < 3 : 4 your_number = int(input("please input your number:")) 5 if your_number == REALLY_NUM : 6 print("woo,you got it!") 7 break 8 elif your_number > REALLY_NUM: 9 print("think bigger!") 10 else: 11 print("think smaller") 12 count = count + 1 13 else: 14 print("you have tried too many times,fuck off")
该程序的注意点:while true或while 变量,变量可以在循环中不断赋值。
3.for循环(步长)
1 #!/usr/local/python3.6.3/bin/python3.6 2 REALLY_NUM = int ("100") 3 for i in range(0,3,1): 4 guess_num = int (input("input your number:")) 5 if guess_num == REALLY_NUM: 6 print("woo,you got it") 7 break 8 elif guess_num > REALLY_NUM: 9 print("think bigger") 10 else: 11 print("think smaller") 12 #else: print('GAME OVER') 13 print("GAME OVER")
该程序的注意点:for后面的括号里可以指定范围和步长,for可以接else,for内的break可以跳出for循环包括此else。注意代码中注释的print及最后一个print的区别。
4、continue及break
1 #!/usr/local/python3.6.3/bin/python3.6 2 for i in range(3): 3 print("--------",i,"----------") 4 for i in range(10): 5 if i > 6: 6 print (i) 7 else: 8 #continue ----如果注释break有事什么情况 9 break 10 print("-----------------循环结束---------------")
------------------------------------------------------------------
-------- 0 ----------
-------- 1 ----------
-------- 2 ----------
-----------------循环结束---------------
该程序的注意点:对比程序中注释掉的continue及break,还有注意程序中两次for循环的i值变化。
5、三元运算
1 #!/bin/env python3.6 2 a= 888 if 100 > 99 else 666 3 print (a) 4 x,y,z = 7,8,9 5 i= x if y>z else z 6 print (i)
-----------------------------------
888
9
七、模块初识
程序运行前,需要将程序中所需要使用的模块先import进去,需要注意的是程序名不能和模块名一致(有些情况下不会报错,但不推荐)
1、sys模块的简单用法
sys.path 显示环境变量#不用加()
1 #!/usr/local/python3.6.3/bin/python3.6 2 import sys 3 print(sys.path)
------------------------------
['/root/myfile/my_python_file','/usr/local/python3.6.3/lib/python36.zip', '/usr/local/python3.6.3/lib/python3.6','/usr/local/python3.6.3/lib/python3.6/lib-dynload', '/usr/local/python3.6.3/lib/python3.6/site-packages'
sys.argv 显示文件名,并且和后面的其他参数一起转换为列表,这一作用很重要,用来获取参数 #不用加()
#!/usr/local/python3.6.3/bin/python3.6 import sys print(sys.argv)
------------------------------------------
./20171117_mod_sys_argv.py hello world 1 2 3
['./20171117_mod_sys_argv.py', 'hello', 'world','1','2','3']
2、os模块的简单用法
os.system(“系统指令”):执行系统指令,将执行结果输出到屏幕,不能赋值保存
os.popen(“系统指令”):执行系统指令,将执行结果保存为指针,可以用read()读取
#!/usr/local/python3.6.3/bin/python3.6 import os os.system("df")#执行并不保存结果 test = os.popen("df") print(test) test_read = os.popen("df").read() print(test_read)
-------------------------------------------------------------\
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/vda1 20510332 4045968 15415848 21% /
devtmpfs 932944 0 932944 0% /dev
tmpfs 942048 24 942024 1% /dev/shm
tmpfs 942048 250588 691460 27% /run
tmpfs 942048 0 942048 0% /sys/fs/cgroup
tmpfs 188412 0 188412 0% /run/user/0
tmpfs 188412 0 188412 0% /run/user/1000
<os._wrap_close object at 0x7fcc683da828>
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/vda1 20510332 4045968 15415848 21% /
devtmpfs 932944 0 932944 0% /dev
tmpfs 942048 24 942024 1% /dev/shm
tmpfs 942048 250588 691460 27% /run
tmpfs 942048 0 942048 0% /sys/fs/cgroup
tmpfs 188412 0 188412 0% /run/user/0
tmpfs 188412 0 188412 0% /run/user/100
os.mkdir(“”) 新建文件夹 os.mkdir("new") 输入文件夹名字即可新建
八、pvc与python运行的过程
在说这个问题之前,我们先来说两个概念,PyCodeObject和pyc文件。我们在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是Python编译器真正编译成的结果。
当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。
当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。
所以我们应该这样来定位PyCodeObject和pyc文件,我们说pyc文件其实是PyCodeObject的一种持久化保存方式。
九、Python的数据类型初识及运算
1、数据类型
数字:int 整数、float 浮点数、complex复数
布尔值:真或假/1或0
字符:‘hello’
字符串 %s;整数 %d;浮点数%f
2.算术运算
算术运算有:加、减、乘、除、取整、求次方的操作
>>> 10 + 5
15
>>> 10-5
5
>>> 10 * 5
50
>>> 9/2
4.5
>>> 9%2
1
>>> 9//2
4
>>> int(9/2)
4
>>> 10 / 3
3.3333333333333335
>>> 10 ** 3
1000
>>> 10 // 3
3
>>>
该代码的说明://取整操作的结果和int(x)的结果一致,不是四舍五入,是直接取整
3、比较运算
比较运算有:等、 不等于、大于、小于、大于等于、小于等于
>>> 'aa'=='bb' False >>> 'aa'!='bb' True >>> 'aa'>='bb' False >>> 'aa'<='bb' True >>> 10 <= 20 True >>> 10 >= 20 False >>> 10 => 20 File "<stdin>", line 1 10 => 20 ^ SyntaxError: invalid syntax
该代码的说明:大于等于要写成>=不能写成=>,同理小于等于也是一样。
4、赋值运算
主要注意的是缩写:+=、-=、*=、/=这样的形式 ,x+=1 -> x=x+1、x/=3 -> x=x/3
5、逻辑运算
与或非三种运算。
>>> 1>10 and 5>9 False >>> 1>10 and 5<9 False >>> 1>10 or 5<9 True >>> not 1>10 True
6、身份运算
>>> a=10 >>> type(a) <class 'int'> >>> b=10.1 >>> type(b) <class 'float'> >>> c='hello' >>> type(c) <class 'str'> >>> a is int False >>> type(a) is int True >>> d=[1,2,3] >>> type(d) is list True >>>
7、成员运算
>>> d=[1,2,3] >>> type(d) is list True >>> >>> 3 in d True >>> 4 in d False >>> 999 not in d True >>>
8、位运算
注意位运算为2的倍数,不是平方、指数上升
>>> 10 <<1
20
>>> 10 << 1
20
>>> 10 << 2
40
>>> 10 << 4
160
>>> 10 >> 4
0
>>> 160 >> 4
10
9、各种运算之间的优先级
计算机能表示的最小单位是二进制位:bit
计算机能存储的最小单位是一个二进制位:bit