第0篇 Python前言
1.1编译型与解释型
- 编译型:一次性编译成2进制,再执行。
- 优点:执行效率高
- 缺点:不能跨平台,开发效率低
- 代表语言:C
- 解释型:逐行解释成二进制,再执行。
- 优点:可以跨平台,开发效率高
- 缺点:执行效率低
- 代表语言:python
1.2注释
1.2.1注释的作用
用自己熟悉的语言在代码中添加注释,方便后期自己查看和理解,也方便其他人查看和理解代码含义。
1.2.2单行注释
以#号开头,#后面的所有内容均不会被程序执行,起到辅助说明的作用。
1 # 这是一行注释,不会被程序执行 2 print("hello world")
说明:为了保证代码的可读性,#后面建议先添加一个空格,然后再添加说明文字。
也可以在代码后面添加注释,为了保证代码的可读性,建议#号和代码之间至少两个空格。
pycharm中使用ctrl+/快捷键来给代码添加和删除注释。
1 # 这是一行注释,不会被程序执行 2 print("hello world") # 这是一行注释
1.4.3多行注释
如果需要添加的注释文字比较多,可以使用多行注释,以"""号开头,以"""号结尾,中间的文字为需要注释的文字,也可以使用'''号开头,使用'''结尾。
1 """ 2 这是 3 多行 4 注释 5 """ 6 print("hello world") # 这是一行注释
1.3缩进(代码块)
Python的代码块不使用大括号{}来控制,Python最具特色的就是使用缩进来写模块。缩进的空白数量是可变的,但是所有代码块语句必须包含相同的缩进空白数量,这个是严格执行的。
- 按照约定俗成的管理,应该始终使用4个空格的缩进;
- 很多Python程序员建议每行不超过80个字符。
- 要将程序的不同部分分开,可以使用空行,但程序中不要使用过多的空行。
1.3.1多个语句构成代码块
- Python中的换行即表示一个语句结束。
- 缩进相同的一组语句构成一个代码块。
- if,while,def和class等复合语句,首行以关键字开始,以冒号:结束,该行之后的一行或多行缩进代码构成代码块。
1.4一行和多行
1.4.1同一行显示多条语句
Python可以在同一行中使用多条语句,语句之间使用分号分割。
1.4.2一条语句以多行来书写
Python语句一般以新行作为语句的结束符,但是可以使用斜杠(\)将一行的语句分为多行显示,如果语句中包含[],{},()就不需要使用多行连接符了。
aa = ["spring", "summer", "autumn", "winter"]
1.5引号
Python可以使用单引号,双引号,三引号来表示字符串,引号的开始与结束必须使用相同类型的,其中三引号可以由多行组成,在文件的特定地点,三引号可以被当做注释。
1.6变量的基本使用
在Python中每个变量在使用前必须赋值,变量赋值以后该变量才会被创建,等号用来给变量赋值。
qq_number = "123456789" # 定义qq号码变量 qq_password = "12345" # 定义qq密码变量 print(qq_number) print(qq_password) # -----输出结果----- # 123456789 # 12345
说明:
- 变量名只有在第一次出现才是定义变量,变量名再次出现,是直接使用之前定义过的变量(相同的作用域)。
- Python中定义变量不需要指定变量的类型,运行的时候根据解释器,自动推导出变量中保存数据的准确类型。
- 变量名可以由字母、数字、下划线组成,不能以数字开头,不能与关键字重名。
- Python中变量名是区分大小写的。
- 在定义变量时,为了保证代码格式,=的左右两边应该个保留一个空格。
- 以下划线开头的变量名都是有特殊意义的:
- 以单下划线开头_foo代表不能直接访问的类属性,需要通过类提供的接口进行访问,不能用from xxx import *导入;
- 以双下划线开头的__foo代表类的私有成员,以双下划线开头和结尾的__foo__代表Python里特殊方法专用的标志,如__init__()代表类的构造函数。
- 在Python中,如果变量名有两个或多个单词组成,可以按如下方式命名:
- 每个单词都使用小写字母,单词与单词之间使用_下划线连接。
- 在python里的变量,函数和模块名使用下划线链接(user_name_and_password);python里的类名使用大驼峰命名法(每个单词的首字母都大写,PersonModel)。
1.7常量
常量即指不变的量,如pai 3.141592653..., 或在程序运行过程中不会改变的量。
举例,假如小米的年龄会变,那这就是个变量,但在一些情况下,他的年龄不会变了,那就是常量。在Python中没有一个专门的语法代表常量,程序员约定俗成用变量名全部大写代表常量。
AGE_OF_PP = 56
1.8关键字
关键字是Python内部已经使用的标识符,我们定义的变量不能与标识符重名。
通过以下命令查看Python中的关键字:
1 import keyword 2 print(keyword.kwlist) 3 4 ------输出结果------ 5 ['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
1.9变量的引用
变量和数据是分开存储的,数据保存在内存中的一个位置,变量中保存着数据在内存中的地址,叫做引用,使用id()函数可以查看变量中保存数据所在的内存地址,另外,如果变量已经被定义,当给一个变量赋值的时候,本质上是修改了数据的引用。
函数传递的本质是实参保存数据的引用,而不是实参保存的数据。
def test(num): print("在函数内部%d对应的内存地址是%d" % (num, id(num))) a = 10 print("a对应的内存地址是%d" % id(a)) #a对应的内存地址是1700357408 test(a) # 在函数内部10对应的内存地址是1700357408
在函数内部返回,实际上返回的是数据的引用,而不是数据本身。
def test(): result = "hello" print("在函数内部变量 %s 的内存地址为 %d " % (result, id(result))) return result a = test() print("变量a的内存地址为 %d " % id(a))
Python中参数传递采用的是“传对象引用”的方式,如果函数收到的是一个可变对象(列表或者字典)的引用,就能修改对象的原始值,如果函数收到的是一个不可变对象(元组,数字,字符串等)的引用,就不能直接修改原始对象。变量和数据都是保存在内存的,但是变量和数据分开保存,数据保存在内存,变量中保存着数据在内存的地址,变量中记录数据的地址叫做引用,可以使用id()函数查看变量的地址。另外,不可变数据类型有元组,字符串,数字类型int,bool,float,complex,long等,可变的数据类型由列表,字典。
在我们使用字典时,字典的key值只能是使用不可变数据类型。
# 1.字符串引用 a = '1234' b = a a = 'hello' print("a:", a) print("b:", b) print("a的内存地址:", id(a)) print("b的内存地址:", id(b)) # 2.列表的引用 a = [1, 2, 3, 4] b = a b[3] = 8 print("a:", a) print("b:", b) print("a的内存地址:", id(a)) print("b的内存地址:", id(b)) # -------输出结果------- # a: hello # b: 1234 # a的内存地址: 2699912795728 # b的内存地址: 2699911133872 # a: [1, 2, 3, 8] # b: [1, 2, 3, 8] # a的内存地址: 2699911201224 # b的内存地址: 2699911201224
1.10局部变量和全局变量
局部变量是在函数内部定义的变量,只能在函数内部使用,全局变量是在函数外部定义的变量(没有定义在某一个函数内),所有函数内部都可以使用这个变量。
在函数内部,可以通过全局变量的引用获取对应的数据,但是,不允许直接修改全局变量的引用。
num = 10 def func1(): num = 90 # 在函数内部定义了一个局部变量 print("func1==>%d" % num) def func2(): print("func2==>%d" % num) func1() func2() # --------输出--------- # func1==>90 # func2==>10
在函数内部修改全局变量,可以使用global关键字。
num = 10 def func1(): global num # global关键字会告诉解释器后面的变量是一个全局变量,在使用赋值语句时,就不会创建局部变量。 print("func1==>%d" % num) def func2(): print("func2==>%d" % num) func1() func2() # --------输出--------- # func1==>10 # func2==>10
全局变量命名的建议:
全局变量名应该增加g_或者gl_的前缀。
1.11程序交互(input)
函数input()让程序暂停运行,等待用户输入一些文本,获取用户输入后,将其值存储到一个变量中,可以方便使用。
name = input("What is your name?") age = input("How old are you?") hometown = input("Where is your hometown?") print("Hello ", name, "your are ", age, "years old, you came from", hometown)
注意:不管用户输入的是什么,变量保存的结果都是字符串。
1.12输出(print)
Python3的输出使用print函数,分为换行输出和不换行输出,在print()的括号中加上字符串,就可以向屏幕上输出指定的文字,括号中还可以放表达式。
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
- sep参数用来表示输出时,每个值之间使用哪个字符作为分隔,默认使用空格作为分隔符。
- 不换行输出:将括号里的所有参数输出在一行,只需要在每一个参数后面加一个,即可。最后一个参数后面没有逗号,参数之间的逗号,输出来之后是空格。
- 换行输出:print()默认的输出是换行的。如果不想换行,后面可以加上end=' ',即print(b,end=' ')
1.12.1输出时常用的函数
- str():将对象转化为适于人阅读的形式,返回一个对象的string形式。
- repr():将对象转化为供解释器读取的形式,返回对象的string形式,可以输出包括转义字符在内的所有字符。
# -*- coding:utf-8 -*- x = "abcde\nf\ng" print(str(x)) print(repr(x)) ---------输出结果---------- abcde f g 'abcde\nf\ng'