第零篇 Python前言

272 阅读9分钟

1.1编译型与解释型

  • 编译型:一次性编译成2进制,再执行。

    • 优点:执行效率高
    • 缺点:不能跨平台,开发效率低
    • 代表语言:C
  • 解释型:逐行解释成二进制,再执行。

    • 优点:可以跨平台,开发效率高
    • 缺点:执行效率低
    • 代表语言:python

1.2注释

1.2.1注释的作用

  用自己熟悉的语言在代码中添加注释,方便后期自己查看和理解,也方便其他人查看和理解代码含义。

1.2.2单行注释

  以#号开头,#后面的所有内容均不会被程序执行,起到辅助说明的作用。

# 这是一行注释,不会被程序执行
print("hello world")

  说明:为了保证代码的可读性,#后面建议先添加一个空格,然后再添加说明文字。

  也可以在代码后面添加注释,为了保证代码的可读性,建议#号和代码之间至少两个空格。

  pycharm中使用ctrl+/快捷键来给代码添加和删除注释。

# 这是一行注释,不会被程序执行
print("hello world")  # 这是一行注释

1.2.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

 说明:

  1. 变量名只有在第一次出现才是定义变量,变量名再次出现,是直接使用之前定义过的变量(相同的作用域)。

  2. Python中定义变量不需要指定变量的类型,运行的时候根据解释器,自动推导出变量中保存数据的准确类型。

  3. 变量名可以由字母、数字、下划线组成,不能以数字开头,不能与关键字重名。

  4. Python中变量名是区分大小写的。

  5. 在定义变量时,为了保证代码格式,=的左右两边应该保留一个空格。

  6. 以下划线开头的变量名都是有特殊意义的:

    1. 以单下划线开头_foo代表不能直接访问的类属性,需要通过类提供的接口进行访问,不能用from xxx import *导入;
    2. 以双下划线开头的__foo代表类的私有成员,以双下划线开头和结尾的__foo__代表Python里特殊方法专用的标志,如__init__()代表类的构造函数。
  7. 在Python中,如果变量名有两个或多个单词组成,可以按如下方式命名:

    1. 每个单词都使用小写字母,单词与单词之间使用_下划线连接。
    2. 在python里的变量,函数和模块名使用下划线链接(user_name_and_password)。
    3. python里的类名使用大驼峰命名法(每个单词的首字母都大写,PersonModel)。

1.7常量

  常量即指不变的量,如pai 3.141592653..., 或在程序运行过程中不会改变的量。

  举例,假如小明的年龄会变,那这就是个变量,但在一些情况下,他的年龄不会变了,那就是常量。在Python中没有一个专门的语法代表常量,程序员约定俗成用变量名全部大写代表常量。

AGE_OF_PP = 56

1.8关键字

  关键字是Python内部已经使用的标识符,我们定义的变量不能与标识符重名。

  通过以下命令查看Python中的关键字:

import keyword
print(keyword.kwlist)

------输出结果------
['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)
  1. sep参数用来表示输出时,每个值之间使用哪个字符作为分隔,默认使用空格作为分隔符。
  2. 不换行输出:将括号里的所有参数输出在一行,只需要在每一个参数后面加一个,即可。最后一个参数后面没有逗号,参数之间的逗号,输出来之后是空格。
  3. 换行输出: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'