第二讲:Python基础

一、基础语法

1. 标识符

1. 定义:所谓的标识符就是对变量、常量、函数、类等对象起的名字。
首先必须说明的是,Python语言在任何场景都严格区分大小写!也就是说A和a代表的意义完全不同。

2. 命名规定

  • 标识符对大小写敏感(严格区分大小写),第一个字符必须是字符表中的字符或者下划线
    1. >>>a = 1
    2. >>>A
    3. Traceback (most recent call last):
    4. File "<stdin>", line 1, in <module>
    5. NameError: name 'A' is not defined

例如,a,abc,_id,等都是可以的。但是例如$a(以$开头的是PHP的变量语法),~abc,123a都是不可以的。这一点一定要注意。
可能有人会问,中文可以作为标识符吗?答案是可以的,但是不建议大家这样做。

  1. >>>姓名 = "小明",打印出‘’ 结果是json
  2. >>>姓名
  3. 'json'

另外,以下划线开头的标识符通常都有特殊意义。以单下划线开头的变量,例如foo代表禁止外部访问的类成员,需通过类提供的接口进行访问,不能用”from xxx import *”导入。而以双下划线开头的,例如__foo,代表类的私有成员;以双下划线开头和结尾的__foo__是python里特殊方法专用的标识。如`_init`代表类的构造函数。

  • 标识符的其他的部分由字母、数字或下划线组成(数字不能开头),这里需要注意特殊字符是不可以的

例如:a123b,bbc,a_b_c_1这些都是可以的。但是a&b,a-b-c这些都是不可以的。
另外,由于l(小写的L)和数字1, 大小写的o与数字0在外观上的相似性,请尽量不要让它们相邻出现,保持语义的清晰性,确保不会发现错误认读的情况。同样,英文中夹塞中文在语法上也是可以的,但绝对不要这么做!

  • 见名知意

看到变量名就知道这个是代表着什么,例如:

  1. age = input('请输入你的年龄')
  2. if age.isdigit():
  3. print("恭喜你,成年了" if int(age)>18 else "你好哇,小朋友" )
  4. else:
  5. print("您输入格式有误")

看到这个age的变量,你就会知道,这个变量代表某个年龄的意思

  • 单词组合:下划线/小驼峰/大驼峰命名法

我们在定义一个函数或者方法的时候,尽量用get_images,count_apple之类的命名方式。当然也可以采用小驼峰的方式,getImages,countApple这种。
类名用大驼峰命名法,例如ThreadMinxIn,ButtonClick这种。就是每个单词的首字母大写,组合在一起就像是驼峰一样高低排列。

  • 变量名通常小写,常量名全部大写

这是代码书写规范的要求。例如可以用PI来表示一个变量,但通常我们都会认为这是代表圆周率的一个常量。
尽量小写模块和包的名字,并且不要和标准库以及著名的第三方库同名。如果同名程序运行会报错。

  • 不以关键字作为标识符:变量的命名不要用关键字和内置函数的名称!!

2. 保留字

Python保留字,也叫关键字,是Python语言官方确定的用作语法功能的专用标识符,不能把它们用作任何自定义标识符名称。关键字只包含小写字母。可以通过python提供的库输出这些关键字
Python的标准库提供了一个 keyword 模块,可以输出当前版本的所有关键字:

  1. >>>import keyword
  2. >>>keyword.kwlist

image.png
第二讲:Python基础 - 图2

如果真的用关键字来当做变量,会怎么样呢?

  1. >>>if = 1
  2. File "<stdin>", line 1
  3. if = 1
  4. ^
  5. SyntaxError: invalid syntax

系统会直接提示语法错误,所以这里一定要注意不要用关键字来当做变量。除了不能使用关键字作为标识符,内置函数同样也是不可以的。sum是一个求和的函数。这里我给它定义成一个字符串看看会有什么结果?

  1. >>>sum([1,2,3]) # 求和函数
  2. 6
  3. >>>sum = 1
  4. >>>sum([1,2,3]) # 报错TypeError-->失去原有的功能
  5. Traceback (most recent call last):
  6. File "<stdin>", line 1, in <module>
  7. TypeError: 'int' object is not callable

3. 注释

编程不光有代码,还要有很多注释。注释有说明、帮助的性质,它们在代码执行过程中相当于不存在、透明的。
1. 单行注释
Python中,以符号’#’为单行注释的开始,从它往后到本行的末尾,都是注释内容。快捷键CTRL+/

  1. # 打印输出hello world
  2. print("hello world")

2. 多行注释
Python没有真正意义上的多行注释(块注释)语法。选中需注释的代码,再使用快捷键CTRL+/

  1. # 第一行注释
  2. # 第二行注释
  3. # 第三行注释

3. 注释文档

  1. """
  2. 这个是函数的说明文档。
  3. :param a: 加数
  4. :param b: 加数
  5. :return: 和
  6. """
  7. '''
  8. 也可以实现多行注释
  9. 与三个双引号作用一致
  10. '''

注意:
很多时候,我们在一些py脚本文件的开头都能看到类似的以#开头的这样两行代码,它们不是注释,是一些设定。

  1. # -*- coding: utf-8 -*-
  2. # @Time : 2020/2/21 13:32
  3. # @Author : Weigongbo
  4. # @File : 02-python基础语法.py

这是通过以下设置实现的:
image.png

  1. #!/usr/bin/env python
  2. # * coding: utf-8 *
  3. # @Time : ${DATE} ${TIME}
  4. # @Author : Weigongbo
  5. # @File : ${NAME}.py

第一行:用于指定运行该脚本的Python解释器,Linux专用,windows不需要。env方式下,系统会自动使用环境变量里指向的Python。还有一种方式,#!/usr/bin/python3.6,这会强制要求使用系统中的python3.6解释器执行文件,这种方式不好,一旦你本地的Python3.6版本删除了,会出现找不到解释器的错误。无论两种方式的哪一种,都指的是在linux下使用 第二行:代码的编码方式。不是程序要处理的数据的编码方式,而是程序自己本身的字符编码。在Python3中,全面支持Unicode(万国码),默认以UTF-8编码,我们不用再纠结中文的问题,乱码的问题,所以本行其实可以不需要。但在Python2中,对字符的编码是个非常令人头疼的问题,通常都需要指定这么一行。 如果要自定义别的编码类型的话,可以像这样:# — coding: cp-1252 —,但如果没有强制需求的话,不要这么做,请坚持使用utf-8编码。这里的-*-是什么意思呢?没意思,装饰美观好看而已。

4. 语句缩进

1. 语句
在代码中,能够完整表达某个意思、操作或者逻辑的最短代码,被称为语句。

  1. a = 321
  2. print("hello world")
  3. input("请输入")

Python的标准语言不需要使用分号,简单的换行就表示语句已经结束!!

2. 代码块
为完成某一特定功能而联系在一起的一组语句,构成一个代码块。有判断、循环、函数、类等各种代码块。代码块的首行通常以关键字开始,以冒号( : )结束。比如

  1. if expression:
  2. pass
  3. elif expression:
  4. pass
  5. else:
  6. pass
  7. for i in range(0,10,1):
  8. i += 1
  9. print(i)

3. 缩进
Python最具特色的语法就是使用缩进来表示代码块,不需要使用大括号
像PHP、JAVA等语言都是使用({})来表示代码块的。python一般用四个空格就是tab来缩进。在PyCharm中tab自动回转成4个空格。在Linux环境中,如VIM编辑器,建议使用空格。那么怎么才是正确的缩进方式呢?

  • 所有的普通语句,顶左开始编写,不需要缩进
  • 所有的语句块,首行不用缩进,从冒号结束后开始下一行,都要缩进
  • 直到该语句块结束,就退回缩进,表示当前块已结束
  • 语句块可以嵌套,所以缩进也可以嵌套

多行语句: 前面是多条语句在一行,但如果一条语句实在太长,也是可以占用多行的,可以使用反斜杠()来实现多行语句。不到迫不得已,不要使用这种,该换行就换行。

  1. string = "i love this country,"\
  2. +"because it is very beautiful!"\

5. pass语句

pass语句是占位语句,只是为了保证语法的正确性而写。以下场景中,可以使用pass语句
• 当你不知道后面的代码怎么写的时候
• 当你不需要写代码细节的时候
• 当语法必须,又没有实际内容可写的时候
• 其它的一些你觉得需要的场景

二、变量与常量

1. 初步认知

  • 变量:在程序运行过程中,值会发生变化的量
  • 常量:在程序运行过程中,值不会发生变化的量

无论是变量还是常量,在创建时都会在内存中开辟一块内存空间,用于保存它的值。
这里有一点需要注意的是,在python中是不需要声明类型的。这是根据Python的动态语言特性而来。变量可以直接使用,而不需要提前声明类型

2. 变量

  • 变量的定义

把程序运算的中间结果临时存到内存里,以备后面的代码继续调用,这几个名字的学名就叫做“变量”。

  • 变量的作用

变量用于存储要在计算机程序中引用和操作的信息。它提供了一种用描述性名称标注数据的方法,这样读者和我们自己就可以更清楚地理解我们的程序。我们可以将变量看作保存信息的容器。它们的目的是在内存中标注和存储数据。然后,可以在整个程序中使用这些数据。

  • 变量的创建
  1. Python 中的变量不需要声明类型

这里的=是赋值而不是等于的意思。每个变量在使用前都必须赋值,变量赋值以后才会被创建。如果一个变量没有赋值,直接用的话。系统会报出错误。这里的等号要理解并读作“赋值”,而不是“等于”,“赋值”是对变量的操作,而“等于”是对两个变量进行比较

  1. >>> a = 4
  2. >>> type(a)
  3. <class 'int'>
  4. >>> b = "hello"
  5. >>> type(b)
  6. <class 'str'>
  1. 每个变量在使用前都必须赋值,变量赋值以后才会被创建

新的变量通过赋值,创建并开辟内存空间保存值。如果没有赋值而直接使用会抛出赋值前引用的异常或者未命名异

  1. >>> a
  2. Traceback (most recent call last):
  3. File "<pyshell#0>", line 1, in <module>
  4. a
  5. NameError: name 'a' is not defined
  6. >>> a = 1
  7. >>> a
  8. 1
  1. Python中,一切事物都是对象,变量引用的是对象或者说是对象在内存中的地址

**

  1. 在Python中,变量本身没有数据类型的概念

例如下所示,变量a在创建时,被赋值为1的整数类型,然后又被改成字符串"haha",再又变成一个列表[1, 2, 3],最后是个字典{ "k1":"v1"}。变量a在动态的改变,它的值分别是不同的数据类型,这是动态语言的特点。

  1. >>> a = 1
  2. >>> a = "haha"
  3. >>> a = [1, 2, 3]
  4. >>> a = { "k1":"v1"}
  1. =号这个赋值运算符是从右往左的计算顺序

    1. >>> a = 11
    2. >>> b = 12
    3. >>> c = a + b # 先计算a+b的值,再赋给c
    4. >>> c
    5. 23
  2. Python允许同时为多个变量赋值 ```python

    a = b = c = 2 a 2 b 2 c 2

a,b,c = 1,2,3 a 1 b 2 c 3 ```

  1. 变量创建过程

例1:a = ‘ABC’ 时,Python解释器干了两件事情:
1.在内存中创建了一个‘ABC’的字符串对象;
2.在内存中创建了一个名为a的变量,并把它指向’ABC’。
第二讲:Python基础 - 图4

例2:打印的结果是什么呢?

  1. a = 'Jack'
  2. b = a
  3. a = 'Tom'
  4. print(b)
  5. print(a)

执行a = ‘Jack’ 解释器创建字符串Jack对象和变量a并指向Jack对象;
执行b = a 解释器创建变量b并且将其指向变量a指向的字符串Jack对象;
执行a = ‘Tom’ 解释器创建字符串Tom对象并把a改为指向Tom对象,与b无关!
第二讲:Python基础 - 图5

3. 常量

常量就是不变的量,或者说在程序运行过程中不会改变的量。比如常用的数学常数圆周率就是一个常量。在Python中,通常用全部大写的变量名表示常量。
但事实上,从Python语法角度看,PI仍然是一个变量,因为Python根本没有任何机制保证PI不会被改变。你完全可以给PI赋值为10,不会弹出任何错误。所以,用全部大写的变量名表示常量只是一个习惯上的用法。

  1. >>> PI = 3.1415
  2. >>> PI
  3. 3.1415
  4. >>> PI = 10
  5. >>> PI
  6. 10

练习

例1:打印输出—>Qian的年龄:18

例2:打印输出—>鲜橙多的年龄:18,性别:女性

  1. name = 'Qian'
  2. age = 18
  3. print(f'{name}的年龄:{age}')
  1. name = '鲜橙多'
  2. age = 18
  3. gender = '女性'
  4. print(f'{name}的年龄:{age},性别:{gender}')

三、输入与输出函数

1. input输入函数

  • input()是内置函数,用来获取用户输入,返回值为字符串。 ```python

    输入name为Bob,返回的是string类型的’Bob’

    name = input(“请输入你的名字:”) 请输入你的名字:Bob name ‘Bob’ type(name)

输入age为11,返回的是string类型的’11’

age = input(“请输入你的年龄:”) 请输入你的年龄:11 age ‘11’ type(age)

输入回车,返回的是’’空字符串

ipt = input(“请输入:”) 请输入: ipt ‘’ type(ipt)

输入a and b,返回的是保留了空格格式的字符串

ipt = input(“请输入:”) 请输入:’a and b’ ipt “‘a and b’” type(ipt)

```

以上代码可看出,输入值不管是什么,type类型都是字符串。type()是Python内置函数之一,用于查看数据类型。

  • 阻塞或暂停程序
    1. print("程序前面部分执行完毕......")
    2. input("请按回车继续......") # 在这里程序会暂停,等待你的回车动作
    3. print("继续执行程序的后面部分......")

此时的input函数不会将输入的值保存下来,只是用作暂停程序动作

练习

输入年龄,判断年龄>18则输出”你好呀,小靓仔”;否则输出”你好呀!小朋友”

  1. #思路:使用面向过程的编码思维
  2. age = input('请输入你的年龄: ')
  3. if int(age) >= 18:
  4. print('你好呀,小靓仔')
  5. elif int(age) < 18:
  6. print('你好呀!小朋友')
  7. else:
  8. print('输入不合法!')
  9. #修正:如果输入的是字符串或者是浮点类型的数据,那么都会报错而导致无法继续运行下去
  10. age = input('请输入你的年龄: ')
  11. if age.isdigit():
  12. age = float(age)
  13. print('你好呀,小靓仔' if age < 18 else '你好呀,小朋友')
  14. else:
  15. print('输入有误,请检查')
  16. #仍然需要修正

2. print输出函数

print() 方法用于打印输出,最常见的一个函数。语法print(self, *args, sep=’ ‘, end=’\n’, file=None) 。常用参数:

  • sep:分隔符符号,在值之间插入的字符串,默认为空格 ```python print(‘你好’,’世界’,sep=’,’)

你好,世界

  1. - **end:**字符串追加在最后一个值之后,默认为换行符\n。如果,设置end='',则可以不换行,让print在一行内连续打印。活用print的参数,可以实现灵活的打印控制。
  2. ```python
  3. print("你好")
  4. print("世界")
  5. print("你好",end=',')
  6. print("世界")
  7. 你好
  8. 世界
  9. 你好,世界
  • print格式化输出

在Python2.6以后,有两种格式化输出的方式。
一种就是类似C语言的printf的%百分号格式化输出,也是Python最基础最常用的格式化输出方式。另一种就是str.format()的方式。

  1. %格式化输出:这里先介绍一下传统的%格式化输出方式,例如:
    1. name = 'Bob'
    2. age = 18
    3. print("我叫%s \n今年%d岁"%(name,age))

首先构造了一个字符串"我叫%s \n今年%d岁",将其中需要用别的变量替换的部分,用%号加一个数据类型代号,前面有多少个%号,后面就要提供多少个参数,每个参数值之间用逗号隔开。每个参数与前面的%,相对应的。并且数据类型也要能够合法对应。

  1. 格式化符号列表如下:

第二讲:Python基础 - 图6

如果你想在print中打印一个%百分符号本身,那么你需要使用%%,两个百分符转义出一个百分符

  1. age=18
  2. print('%d%%'%age)
  3. 18%

拓展:print()函数

  1. %字符:标记转换说明符的开始
  2. 转换标志:-表示左对齐;+表示在转换值之前要加上正负号;“”(空白字符)表示正数之前保留空格;0表示转换值若位数不够则用0填充
  3. 最小字段宽度:转换后的字符串至少应该具有该值指定的宽度。如果是*,则宽度会从元组中读出
  4. 点(.)后跟精度值:如果转换的是实数,精度值就表示出现在小数点后的位数。如果转换的是字符串,那么该数字就表示最大字段宽度。如果是*,那么精度将从元组中读出
  5. 字符串格式化转换类型

转换类型 含义 d,i 带符号的十进制整数 o 不带符号的八进制 u 不带符号的十进制 x 不带符号的十六进制(小写) X 不带符号的十六进制(大写) e 科学计数法表示的浮点数(小写) E 科学计数法表示的浮点数(大写) f,F 十进制浮点数 g 如果指数大于-4或者小于精度值则和e相同,其他情况和f相同 G 如果指数大于-4或者小于精度值则和E相同,其他情况和F相同 C 单字符(接受整数或者单字符字符串) r 字符串(使用repr转换任意Python对象) s 字符串(使用str转换任意Python对象)

  1. 如何让 print 不换行,在Python中总是默认换行的

  2. 拼接字符串:

  1. >>> pi = 3.141592653
  2. >>> print('%10.3f' % pi) #字段宽10,精度3
  3. 3.142
  4. >>> print("pi = %.*f" % (3,pi)) #用*从后面的元组中读取字段宽度或精度
  5. pi = 3.142
  6. >>> print('%010.3f' % pi) #用0填充空白
  7. 000003.142
  8. >>> print('%-10.3f' % pi) #左对齐
  9. 3.142
  10. >>> print('%+f' % pi) #显示正负号
  11. +3.141593
  1. >>> for i in range(0,10):
  2. print(i)
  3. 0
  4. 1
  5. 2
  6. 3
  7. 4
  8. 5
  9. 6
  10. 7
  11. 8
  12. 9
  13. >>> for i in range(0,10):
  14. print(i,end = '')
  15. 0123456789
  16. >>>
  1. >>> "Hello""World"
  2. 'HelloWorld'
  3. >>> x = "Hello"
  4. >>> y = "world"
  5. >>> xy
  6. Traceback (most recent call last):
  7. File "<pyshell#10>", line 1, in <module>
  8. xy
  9. NameError: name 'xy' is not defined
  10. >>> x+y
  11. 'Helloworld'

练习

  • 输入年龄,如果超过18岁,输出 ‘恭喜你,成年了’ ,如果低于18岁,输出 ‘你好哇,小朋友’ ,如果输入了其它数据,提示 ‘您的输入有误’
  1. age = input('请输入你的年龄')
  2. if age.isdigit():
  3. print("恭喜你,成年了" if int(age)>18 else "你好哇,小朋友" )
  4. else:
  5. print("您输入格式有误")
  • 请搭建一个简易版本的逻辑管理系统1.需要用户输入姓名,身份证号以及电话号码。2.如果用户选择打印出输入的信息,则打印输出”欢迎*同学加入逻辑,您的身份证号是*,您的电话是*。我们将诚心为您服务”。否则输出”感谢您使用该系统”。(注意这一块会使用到简单的条件判断语句,根据课堂上讲解的知识够用,字符串拼接大家可以使用多种方式)
  1. print('*'*6,'这里是逻辑管理系统','*'*6)
  2. name = input('请输入您的姓名:')
  3. id_card = input('请输入您的身份证号码:')
  4. tel = input('请输入您的手机号码:')
  5. yes_or_no = input('请问您需要打印出来吗?请输入Y/N:')
  6. if yes_or_no.upper() == 'Y' and len([id_card,name,tel]) == [15,6,11] :
  7. print(f'欢迎:{name}加入逻辑管理系统\n您的身份证号码是:{id_card}\n您的电话是:{tel}\n
  8. 我们将竭诚为您服务!')
  9. else:
  10. print('信息输入有误,请重新输入!')
  • 实现:输入所在地址,打印输出 “我在**,为湖北加油!”
  1. addr = input('请输入我的地址')
  2. print(f'我在:{addr}\n 我为武汉加油!' if addr.isalpha() else f'我在:中国\n 我为武汉加油!')