运行Python程序的两种方式

小白学习,如有错误欢迎指点

一、每位小白写的第一个Python程序

1.运行Python程序的两种方式

1.1 交互式模式(即时对话)

打开cmd,打开Python解释器

输入 print("hello world")

回车直接显示 hello world

(交互式能够及时得到代码执行结果,调试程序十分方便,但无法保存代码)

1.2 脚本文件的方式(约定此类文件后缀为.py,虽然没有后缀也没事)

打开一个文本编辑器,写入 print("hello world") 这段代码并保存至D:\test.py

打开cmd,直接输入 python D:\test.py #python+文件路径

回车显示 hello world (即运行结果)

(代码可以永久保存,以后开发程序主要都是将代码写入文件即使用脚本的方式,偶尔打开交互式模式调试其中某一段代码验证结果)

2.运行Python程序的三步骤启动python解释器

解释器发送系统调用,将已写好的代码文件内容读入至内存(此时文件内的字符没有任何语法意义,只是一些普通字符)

解释器读取刚刚读入内存的内容,并识别python语法并执行

对比文本编辑器读取代码文件的步骤启动文本编辑器

文本编辑器发送系统调用,将已写好的代码文件内容读入至内存

文本编辑器读取刚刚读入内存的内容,将内容输出到屏幕上,让用户看到结果

总结:其实python解释器也是一种程序,所以两者的前两个步骤完全相同,只有在第三步对读取的代码的处理方式不同即仅仅每个程序最后所实现的功能不同而已。

二、IDE工具(集成开发环境)——pycharm

IDE的意义:IDE(Integrated Development Environment)顾名思义,就是集合了开发所需的一切工具构成一个整体的开发环境(如代码提示,代码补全,代码纠错,及时保存文件等等功能),拥有IDE工具后能够极大提升程序员的开发效率,目前开发python程序最好的IDE就是pycharm

pycharm安装:一般使用专业版,所含功能更多

虚拟环境:

虚拟环境就相当于初始真实环境的复制体,每开发一个新项目,我们都应该建立一个虚拟环境,以供下载安装第三方的库,当项目结束之后就可以将虚拟环境删掉,重新建立新的环境,避免对下一个开发项目造成污染影响。

三、python语法(语法就是规则、原则)

每一个语法其实都是在模仿取代人类的某项能力,所以学习语法的方法:

三步走:是什么,为什么,怎么用(what、why、how)

1.注释

what:

注释就是对代码的解释说明,注释部分不会被当做代码执行

why:

增强代码的可读性(模仿人的解释说明的能力),可以注释掉不想运行的代码

how:

注释分为单行注释和多行注释

单行注释用#,可写在代码正上方或者正后方

多行注释用三对双引号或单引号,分别放在代码正上方和正下方(多行注释一般只在代码开头写一次)

# 注释不要用拼音,只标记关键代码,不用全文注释

2.变量(标识符的一种)

what:

变量是指变化的量,量即事物的状态(如游戏角色的等级,性别,金钱)

why:

程序运行的本质是一系列状态的变化,需要一种机制能够保存记录事物的状态,而事物的状态是不断发生变化的(模仿人的记忆事物的能力),变量其实就是存取内存的机制

how:先定义,后引用(先存后取)

定义变量:

变量名=变量值(解释器执行变量定义时,会申请内存空间存放变量值,存放地址绑定给变量名,这样就可以通过变量名获取相应变量值)

# 可以同时为多个变量赋值 如: a,b = 1,2

命名规范:见名知意

变量名只能是字母(包括中文等语言字符)、数字、下划线的组合(尽量不要使用中文)

第一个字符不能是数字

关键字不能被定义成变量名,但可以被包含(如and、as、def、if、for、while、is、not、else、or等等)

python中变量名一般使用纯小写下划线风格,一般空格可以用“_”下划线替代(如age_of_lili=56)

#驼峰体是变量名的每个单词首字母大写

补充:del 变量名 表示解除变量名与变量值的绑定关系 (垃圾回收引用计数减少)

变量的三大特性id:变量的内存地址,每个变量都有唯一编号 # 查看id的方式 print(id(变量名))

type:变量值的类型(如str,int,float等) # 查看type的方式 print(type(变量名))

value:变量值 # 查看值的方式 print(变量名)

#两个等号“==”比较的仅仅是value值,“is”比较的是id(出于对性能的优化,所以不同的变量,当变量值相同时,id也可能相同,如变量值是在小整数池内的变量,这是一种内存优化机制)

常量(python中没有常量的说法或规范)

与变量相对即程序运行时,固定不变的值(量),在python中用法和变量一样,只是常量一般约定变量名全部用大写表示(如PI=3.1415926),但本质上变量值还是可以修改的

# 与python不同,C语言中有专门的语法定义常量且一旦定义为常量,再变更就会报错

3.基本数据类型

有了变量后,我们就可以记录事物的状态,但事物的状态有不同种类(年龄,性别,身高,名字等),所以变量值也有不同的类型

type(变量名):可查询对应变量值的数据类型

3.1 数字类型:int整型:用于标识年龄,等级,QQ号,身份证号码等等整数类的变量,如:age=10,age=int("10"),int可以把纯数字的其他类型数据转化为整型

float浮点型:用于标识身高,体重等存在小数的变量,如 salary=float(3.2)

complex复数型:如x=1+2j

3.2 str字符串类型:

用于记录姓名,国籍,住址等描述性变量,用单引号,双引号,多引号都可以定义字符串,但是要考虑引号嵌套配对问题。如:name=“lili”,多引号可以写多行字符串

# 字符串中想加引号,应该外层双引号,内层单引号使用

如:print(“ name is 'lili' ”)或者 print(' name is \'lili\' ')

(其中“\”有转义的意思,表示后边的引号不再有特殊意义,就是普通字符而已,\不能用在{}内)(使用r 也可以让反斜杠不发生转义,r是raw原始的意思)

#字符串之间可以互相相加,相乘运算(都只是字符串拼接)

# 切片提取字符串相应数据 [头索引:尾索引:步长](字符串索引只能取值不能更改值)

str[1:3]获取字符串中索引1~2的字符,不包含3;#str是变量名,顾头不顾尾

str[:]获取字符串中索引0~最后的所有字符;

str[-3:-1]提取字符串中索引(-3)~(-1)的字符,不包含(-1);

str[-1:-3]提取字符串为空字符串,但系统不提示错误;

str[::2]获取字符串中索引0~最后的所有字符,但步长为2即每两个字符获取一次,如“string”最终获取的是“srn”;如果步长为负数,就是逆向取值

# 切分 变量名.split("分隔符") 这里的分隔符可以是字符串内的任意字符,切分后是list数据类型(不指定分隔符就默认为空格)

# 移除两边空白(空格) : 变量名.strip()(括号内不填写默认移除空格、\n、\t,填写其他的就移除指定字符,注意只能移除字符串两边的,中间的不行)

3.3 list列表:用于记录多个相同属性的变量值(也可以是不同属性的),方便取用,在[]内用逗号分隔表示。

如 stu_names=['lili','kitty','ming']

列表类型是用索引来对应值,从0开始计数,# -1表示列表的最后一个变量值

如 stu_names[1],执行过后显示 'kitty'

# 增加元素 变量名.append(元素)插在末尾 或者 变量名.insert(索引号,元素)插在索引号对应元素的前面(不能通过直接增加索引和值来增加元素)

删除元素 del 变量名[索引]

切片与字符串类似(顾头不顾尾)

列表的长度是指元素的总个数

列表嵌套:形如 info=[[xx,xx],[x,x]]等等。使用list的原因在于取用信息是按根据位置顺序来取的

3.4 dict字典:记录多个不同属性的变量值,可以明确表示值的含义,在{}中用逗号分隔表示

如 person_info={'name':'lili','age':18,'height':171.4}

字典类型是用key(键)来对应值,key通常都为字符串,如 person_info['age'],执行后显示 18

增加元素 直接增加key和值即可 : 变量名[key]=值

删除元素 del 变量名[key]

字典嵌套:形如 info=[{xx:xx,xx:xx},{x:x,x:x}]等,使用字典的原因在于取用信息是根据具体key即关键词来取的

#注意 成员运算判断字典时默认都是判断key,而不是key后面的元素

3.5 bool布尔类型:用于记录真假两种状态,即True和False

所有数据类型都自带布尔值:None,0,空(空字符串,空列表,空字典等)三种情况布尔值为False(0),其余均为True(1)

布尔值也可以和数字运算

3.6 tuple元组

元组内元素不能修改,写在()内,元素间用逗号隔开,其余和列表类似

3.7 set集合

4. 可变数据类型和不可变数据类型

可变数据类型:变量值改变后,id未变(如字典,列表,集合)

不可变数据类型:变量值改变后,id也改变(如数字类型,字符串,元组)

5. 输入输出(用户交互)

输入:

username=input("请输入你的账号:")

#python3中input功能用户输入的内容均存为字符串赋值给变量名,相当于python2中的raw_input 功能,而python2中的input功能则是用输入什么数据类型,就存为什么类型(python2的机制对用户不友好,需要用户了解数据类型的区别,所以python3中做了改进)

输出:即print()

格式化输出方式:

①%号

msg="my name is %s ,my age is %d" % (“lili”,21)

print(msg) #这样就成为一个模板,格式化输出

# %s通用,%d只能代替数字类型 (%s、%d 叫做占位符)

%()s 可用于字典

②str.format(推荐)

print ("my name is {},my age is {}".format("lili",21)) #按正常顺序

print ("my name is {0},my age is {1}".format("lili",21)) #使用索引

print ("my name is {name},my age is {age}".format(name="lili",age=21)) #使用字典

print ("my name is {name},my age is {age}".format(**变量名)) #使用**来解包

print("{0:*<10}".format(变量名)) # 左对齐共10个字符,变量名内容左对齐,剩余的用*填充

print("{0:*^10}".format(变量名)) #居中共10个字符,变量名内容在中间,剩余的用*填充

print("{salary:.3f}".format(salary=1232132.12351))# 精确到小数点后三位,四舍五入

print("{0:b}".format(123))# 将变量转换成二进制(binary)

③f-Strings(f或F) # python3.5后能用

name="lili"

age=21

print (f"my name is {name},my age is {age}") #{}中可以是变量名,表达式等等

补充: 换行符:\n 这是print默认功能的参数 print=(“abc”,end=“\n”)

(一般换行需两步:先至行首,再换行 \r\n,python中简化了)

四、垃圾回收(GC)机制(回收无效变量值所占内存)

原因:在定义变量过程中解释器会申请开辟内存空间存放变量的值,而内存容量是有限的,同时有些变量值在程序运行过程中会逐渐变为无效变量即垃圾,而这些垃圾还是会占着有限的内存空间最终导致内存溢出,系统崩溃,所以我们需要一种机制管理内存来对其回收清理,释放出内存。 # Cpython自带了自动的垃圾回收机制来解决这个问题(懂得其中原理即可)

堆区和栈区

变量名与值的内存地址的关联关系存于栈区

变量值存于堆区(回收内存就是回收的堆区的内容)

直接引用和间接引用

直接引用指从栈区直接引到内存地址

间接引用指从栈区到堆区后通过进一步的引用到达最终的内存地址

垃圾回收机制大致过程:先通过“引用计数”跟踪并回收垃圾,再通过“标记-清除”解决循环引用所产生的无法回收垃圾,同时通过“分代回收”以提高垃圾回收效率

引用计数:变量值被变量名关联的次数(引用计数的增加减少都各有两种方式——直接和间接),一旦循环计数为0,那么其占用的内存就会被回收

引用计数出现的两个问题:

1.循环引用

循环引用(交叉引用)即存在相互引用,一旦两个变量都与变量值解除绑定后,变量值的引用计数不会变为0 ,其内存也就无法被回收(类似于内存泄漏)

解决方案:标记清除

当可用内存被耗尽时,就会停止程序运行,进行先标记(标记所有可以被访问到的变量值,剩余的就是无效垃圾)再清除(将没有标记的都回收)

2.效率问题

引用计数的回收机制每次都将所有对象遍历一遍会非常耗时间

解决方案:分代回收(以空间换时间)

经过多次遍历后根据变量值的存活时间将其分等级(分代),权重越高,GC扫描的频率就越低,这样每次扫描的变量的总个数就减少了,从而提高回收效率(空间换时间的原因:分代回收可能导致部分垃圾无法及时回收,但是总体会提高效率)

五、基本运算符

1.算数运算符

+、-、*、/、//(取整)、**(乘方、幂)、%(取余数,取模)

2.比较运算符(返回的是布尔值true,false)

、<=、>=、==(比较对象是否相等)、!=(比较是否不相等)、<>(3.0版本已取消,比较是否不相等)

3.赋值运算(数学运算)

只要在算数运算符后面加个“=”号就是赋值运算符(“=”是最简单的赋值运算符)

c += a 等效于 c=c+a,相当于简化了代码(写代码还是要注重可读性,不能为了简化而简化)

#另外还有链式赋值x=y=z,交叉赋值m,n=n,m,解压赋值a,b,c,d=变量名(“*_”可以取首尾几个值)等

4.逻辑运算

and、or、not(与,或,非) ,三者混合运算时有优先级(not>and>or)

# 逻辑运算时,遵循短路运算规则(运算结果一旦确定,后续运算就直接停止)

5.成员运算符(返回值为布尔值)

in:判断一个对象是否包含于另一个对象中,字符串、列表、字典都支持运算,注意字典判断的是key,而不是冒号后面的值

not in :和in逻辑相反,用法相同

6.身份运算符(返回值为布尔值)

is,not is(用于计算判断id是否相同)

六、流程控制

流程控制一般有三种执行流程:顺序结构(一般代码顺序)、分支结构(if判断)、循环结构(while、for循环)

1.分支结构(根据条件的不同选择执行不同分支的子代码)

使用:

if判断语句 (可以嵌套)(写完条件记得加冒号)(有单分支,双分支,多分支结构)

if 条件1 :

子代码块

elif 条件2 :

代码块

else:

代码块

# 在if判断中,所有数据类型最后都会转化为布尔类型(真假两种情况)

2.循环结构(重复执行某段代码块)模仿人类重复工作的能力

使用:

2.1 while循环(条件循环)语句

while 条件:

代码块

# 当条件判断为true,就执行子代码块(循环体),执行完毕后再次进入循环,重新判断条件,当条件一直为true时,就相当于进入死循环,当条件变为false时,循环停止。循环语句可以简化重复代码,且及时结束循环

while+break 使用

(break用于退出本层循环,当有嵌套循环时注意break仅仅只能退一层循环)

while+continue 使用

(continue用于退出本次循环,继续进入下一次循环)

while+tag 使用

(tag用于嵌套了多层while循环,想从某一层循环中直接退出所有循环,tag可以作为所有while循环的统一变量,这样一旦tag判定为false,那么就可以退出所有层的循环)

while+else 使用

(当while循环正常执行完就会继续执行else后面的代码,但如果中间有break打断,则不执行else里的代码,直接退出本层循环)

2.2 for循环语句(用于循环取值即遍历值时,比while循环使用更简洁)

for 变量名 in 可迭代对象 :

代码块

#可迭代对象可以是字符串,列表,字典(in 是成员运算符,所以当取字典时,取的是字典中的key,而不是冒号后的值),当可迭代对象的值都取完后,循环结束,break和continue也可以用于for循环,用法和while循环相同

#range(start, stop, step)通常用于for循环中,

range(0,5,1)等同于range(0,5)表示[0,1,2,3,4],不包括5,和提取字符串方式类似

#enumerate 可用于 for循环 可显示列表索引号

for i in enumerate(变量名):

补充:

del 可以删除单个或多个对象

变量名.append() #在变量名中增加一个元素

len()用于测量数据的长度

str.isdigit( ) 用于检测字符串是否只由纯数字组成,返回值为布尔值

range(8) 表示会逐个从0取到7, 共8个数字,可用于for循环

内存飙升的原因:有程序不断向内存存数据,但未及时删除无效数据,导致无效数据占据了大量内存空间

cpu飙升的原因:CPU处于高速运算中时CPU的利用率会迅速上升,如果长期处于高处,那么可能是某个程序陷入死循环了,在不断命令CPU进行运算,要及时解决这个死循环,否则cpu可能会被烧坏

更多推荐

运行python程序的两种方式交互式和文件式_Python基础知识2