第二讲:Python基础
一、基础语法
1. 标识符
1. 定义:所谓的标识符就是对变量、常量、函数、类等对象起的名字。
首先必须说明的是,Python语言在任何场景都严格区分大小写!也就是说A和a代表的意义完全不同。
2. 命名规定
- 标识符对大小写敏感(严格区分大小写),第一个字符必须是字符表中的字符或者下划线
>>>a = 1
>>>A
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'A' is not defined
例如,a,abc,_id,等都是可以的。但是例如$a(以$开头的是PHP的变量语法),~abc,123a都是不可以的。这一点一定要注意。
可能有人会问,中文可以作为标识符吗?答案是可以的,但是不建议大家这样做。
>>>姓名 = "小明",打印出‘’ 结果是json
>>>姓名
'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在外观上的相似性,请尽量不要让它们相邻出现,保持语义的清晰性,确保不会发现错误认读的情况。同样,英文中夹塞中文在语法上也是可以的,但绝对不要这么做!
- 见名知意
看到变量名就知道这个是代表着什么,例如:
age = input('请输入你的年龄')
if age.isdigit():
print("恭喜你,成年了" if int(age)>18 else "你好哇,小朋友" )
else:
print("您输入格式有误")
看到这个age的变量,你就会知道,这个变量代表某个年龄的意思
- 单词组合:下划线/小驼峰/大驼峰命名法
我们在定义一个函数或者方法的时候,尽量用get_images,count_apple之类的命名方式。当然也可以采用小驼峰的方式,getImages,countApple这种。
类名用大驼峰命名法,例如ThreadMinxIn,ButtonClick这种。就是每个单词的首字母大写,组合在一起就像是驼峰一样高低排列。
- 变量名通常小写,常量名全部大写
这是代码书写规范的要求。例如可以用PI来表示一个变量,但通常我们都会认为这是代表圆周率的一个常量。
尽量小写模块和包的名字,并且不要和标准库以及著名的第三方库同名。如果同名程序运行会报错。
- 不以关键字作为标识符:变量的命名不要用关键字和内置函数的名称!!
2. 保留字
Python保留字,也叫关键字,是Python语言官方确定的用作语法功能的专用标识符,不能把它们用作任何自定义标识符名称。关键字只包含小写字母。可以通过python提供的库输出这些关键字
Python的标准库提供了一个 keyword 模块,可以输出当前版本的所有关键字:
>>>import keyword
>>>keyword.kwlist
如果真的用关键字来当做变量,会怎么样呢?
>>>if = 1
File "<stdin>", line 1
if = 1
^
SyntaxError: invalid syntax
系统会直接提示语法错误,所以这里一定要注意不要用关键字来当做变量。除了不能使用关键字作为标识符,内置函数同样也是不可以的。sum是一个求和的函数。这里我给它定义成一个字符串看看会有什么结果?
>>>sum([1,2,3]) # 求和函数
6
>>>sum = 1
>>>sum([1,2,3]) # 报错TypeError-->失去原有的功能
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
3. 注释
编程不光有代码,还要有很多注释。注释有说明、帮助的性质,它们在代码执行过程中相当于不存在、透明的。
1. 单行注释
Python中,以符号’#’为单行注释的开始,从它往后到本行的末尾,都是注释内容。快捷键CTRL+/
# 打印输出hello world
print("hello world")
2. 多行注释
Python没有真正意义上的多行注释(块注释)语法。选中需注释的代码,再使用快捷键CTRL+/
# 第一行注释
# 第二行注释
# 第三行注释
3. 注释文档
"""
这个是函数的说明文档。
:param a: 加数
:param b: 加数
:return: 和
"""
'''
也可以实现多行注释
与三个双引号作用一致
'''
注意:
很多时候,我们在一些py脚本文件的开头都能看到类似的以#开头的这样两行代码,它们不是注释,是一些设定。
# -*- coding: utf-8 -*-
# @Time : 2020/2/21 13:32
# @Author : Weigongbo
# @File : 02-python基础语法.py
这是通过以下设置实现的:
#!/usr/bin/env python
# * coding: utf-8 *
# @Time : ${DATE} ${TIME}
# @Author : Weigongbo
# @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. 语句
在代码中,能够完整表达某个意思、操作或者逻辑的最短代码,被称为语句。
a = 321
print("hello world")
input("请输入")
Python的标准语言不需要使用分号,简单的换行就表示语句已经结束!!
2. 代码块
为完成某一特定功能而联系在一起的一组语句,构成一个代码块。有判断、循环、函数、类等各种代码块。代码块的首行通常以关键字开始,以冒号( : )结束。比如
if expression:
pass
elif expression:
pass
else:
pass
for i in range(0,10,1):
i += 1
print(i)
3. 缩进
Python最具特色的语法就是使用缩进来表示代码块,不需要使用大括号
像PHP、JAVA等语言都是使用({})来表示代码块的。python一般用四个空格就是tab来缩进。在PyCharm中tab自动回转成4个空格。在Linux环境中,如VIM编辑器,建议使用空格。那么怎么才是正确的缩进方式呢?
- 所有的普通语句,顶左开始编写,不需要缩进
- 所有的语句块,首行不用缩进,从冒号结束后开始下一行,都要缩进
- 直到该语句块结束,就退回缩进,表示当前块已结束
- 语句块可以嵌套,所以缩进也可以嵌套
多行语句: 前面是多条语句在一行,但如果一条语句实在太长,也是可以占用多行的,可以使用反斜杠()来实现多行语句。不到迫不得已,不要使用这种,该换行就换行。
string = "i love this country,"\
+"because it is very beautiful!"\
5. pass语句
pass语句是占位语句,只是为了保证语法的正确性而写。以下场景中,可以使用pass语句
• 当你不知道后面的代码怎么写的时候
• 当你不需要写代码细节的时候
• 当语法必须,又没有实际内容可写的时候
• 其它的一些你觉得需要的场景
二、变量与常量
1. 初步认知
- 变量:在程序运行过程中,值会发生变化的量
- 常量:在程序运行过程中,值不会发生变化的量
无论是变量还是常量,在创建时都会在内存中开辟一块内存空间,用于保存它的值。
这里有一点需要注意的是,在python中是不需要声明类型的。这是根据Python的动态语言特性而来。变量可以直接使用,而不需要提前声明类型
2. 变量
- 变量的定义
把程序运算的中间结果临时存到内存里,以备后面的代码继续调用,这几个名字的学名就叫做“变量”。
- 变量的作用
变量用于存储要在计算机程序中引用和操作的信息。它提供了一种用描述性名称标注数据的方法,这样读者和我们自己就可以更清楚地理解我们的程序。我们可以将变量看作保存信息的容器。它们的目的是在内存中标注和存储数据。然后,可以在整个程序中使用这些数据。
- 变量的创建
- Python 中的变量不需要声明类型
这里的=
是赋值而不是等于的意思。每个变量在使用前都必须赋值,变量赋值以后才会被创建。如果一个变量没有赋值,直接用的话。系统会报出错误。这里的等号要理解并读作“赋值”,而不是“等于”,“赋值”是对变量的操作,而“等于”是对两个变量进行比较
>>> a = 4
>>> type(a)
<class 'int'>
>>> b = "hello"
>>> type(b)
<class 'str'>
- 每个变量在使用前都必须赋值,变量赋值以后才会被创建
新的变量通过赋值,创建并开辟内存空间保存值。如果没有赋值而直接使用会抛出赋值前引用的异常或者未命名异
>>> a
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
a
NameError: name 'a' is not defined
>>> a = 1
>>> a
1
- Python中,一切事物都是对象,变量引用的是对象或者说是对象在内存中的地址
**
- 在Python中,变量本身没有数据类型的概念
例如下所示,变量a在创建时,被赋值为1的整数类型,然后又被改成字符串"haha",再又变成一个列表[1, 2, 3],最后是个字典{ "k1":"v1"}。变量a在动态的改变,它的值分别是不同的数据类型,这是动态语言的特点。
>>> a = 1
>>> a = "haha"
>>> a = [1, 2, 3]
>>> a = { "k1":"v1"}
=号这个赋值运算符是从右往左的计算顺序
>>> a = 11
>>> b = 12
>>> c = a + b # 先计算a+b的值,再赋给c
>>> c
23
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:a = ‘ABC’ 时,Python解释器干了两件事情:
1.在内存中创建了一个‘ABC’的字符串对象;
2.在内存中创建了一个名为a的变量,并把它指向’ABC’。
例2:打印的结果是什么呢?
a = 'Jack'
b = a
a = 'Tom'
print(b)
print(a)
执行a = ‘Jack’ 解释器创建字符串Jack对象和变量a并指向Jack对象;
执行b = a 解释器创建变量b并且将其指向变量a指向的字符串Jack对象;
执行a = ‘Tom’ 解释器创建字符串Tom对象并把a改为指向Tom对象,与b无关!
3. 常量
常量就是不变的量,或者说在程序运行过程中不会改变的量。比如常用的数学常数圆周率就是一个常量。在Python中,通常用全部大写的变量名表示常量。
但事实上,从Python语法角度看,PI仍然是一个变量,因为Python根本没有任何机制保证PI不会被改变。你完全可以给PI赋值为10,不会弹出任何错误。所以,用全部大写的变量名表示常量只是一个习惯上的用法。
>>> PI = 3.1415
>>> PI
3.1415
>>> PI = 10
>>> PI
10
练习
例1:打印输出—>Qian的年龄:18
例2:打印输出—>鲜橙多的年龄:18,性别:女性
name = 'Qian'
age = 18
print(f'{name}的年龄:{age}')
name = '鲜橙多'
age = 18
gender = '女性'
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内置函数之一,用于查看数据类型。
- 阻塞或暂停程序
print("程序前面部分执行完毕......")
input("请按回车继续......") # 在这里程序会暂停,等待你的回车动作
print("继续执行程序的后面部分......")
此时的input函数不会将输入的值保存下来,只是用作暂停程序动作
练习
输入年龄,判断年龄>18则输出”你好呀,小靓仔”;否则输出”你好呀!小朋友”
#思路:使用面向过程的编码思维
age = input('请输入你的年龄: ')
if int(age) >= 18:
print('你好呀,小靓仔')
elif int(age) < 18:
print('你好呀!小朋友')
else:
print('输入不合法!')
#修正:如果输入的是字符串或者是浮点类型的数据,那么都会报错而导致无法继续运行下去
age = input('请输入你的年龄: ')
if age.isdigit():
age = float(age)
print('你好呀,小靓仔' if age < 18 else '你好呀,小朋友')
else:
print('输入有误,请检查')
#仍然需要修正
2. print输出函数
print() 方法用于打印输出,最常见的一个函数。语法print(self, *args, sep=’ ‘, end=’\n’, file=None) 。常用参数:
- sep:分隔符符号,在值之间插入的字符串,默认为空格 ```python print(‘你好’,’世界’,sep=’,’)
你好,世界
- **end:**字符串追加在最后一个值之后,默认为换行符\n。如果,设置end='',则可以不换行,让print在一行内连续打印。活用print的参数,可以实现灵活的打印控制。
```python
print("你好")
print("世界")
print("你好",end=',')
print("世界")
你好
世界
你好,世界
- print格式化输出
在Python2.6以后,有两种格式化输出的方式。
一种就是类似C语言的printf的%百分号格式化输出,也是Python最基础最常用的格式化输出方式。另一种就是str.format()的方式。
- %格式化输出:这里先介绍一下传统的%格式化输出方式,例如:
name = 'Bob'
age = 18
print("我叫%s \n今年%d岁"%(name,age))
首先构造了一个字符串"我叫%s \n今年%d岁",将其中需要用别的变量替换的部分,用%号加一个数据类型代号,前面有多少个%号,后面就要提供多少个参数,每个参数值之间用逗号隔开。每个参数与前面的%,相对应的。并且数据类型也要能够合法对应。
- 格式化符号列表如下:
如果你想在print中打印一个%百分符号本身,那么你需要使用%%,两个百分符转义出一个百分符
age=18
print('%d%%'%age)
18%
拓展:print()函数
- %字符:标记转换说明符的开始
- 转换标志:-表示左对齐;+表示在转换值之前要加上正负号;“”(空白字符)表示正数之前保留空格;0表示转换值若位数不够则用0填充
- 最小字段宽度:转换后的字符串至少应该具有该值指定的宽度。如果是*,则宽度会从元组中读出
- 点(.)后跟精度值:如果转换的是实数,精度值就表示出现在小数点后的位数。如果转换的是字符串,那么该数字就表示最大字段宽度。如果是*,那么精度将从元组中读出
- 字符串格式化转换类型
转换类型 含义 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对象)
如何让 print 不换行,在Python中总是默认换行的
拼接字符串:
>>> pi = 3.141592653
>>> print('%10.3f' % pi) #字段宽10,精度3
3.142
>>> print("pi = %.*f" % (3,pi)) #用*从后面的元组中读取字段宽度或精度
pi = 3.142
>>> print('%010.3f' % pi) #用0填充空白
000003.142
>>> print('%-10.3f' % pi) #左对齐
3.142
>>> print('%+f' % pi) #显示正负号
+3.141593
>>> for i in range(0,10):
print(i)
0
1
2
3
4
5
6
7
8
9
>>> for i in range(0,10):
print(i,end = '')
0123456789
>>>
>>> "Hello""World"
'HelloWorld'
>>> x = "Hello"
>>> y = "world"
>>> xy
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
xy
NameError: name 'xy' is not defined
>>> x+y
'Helloworld'
练习
- 输入年龄,如果超过18岁,输出 ‘恭喜你,成年了’ ,如果低于18岁,输出 ‘你好哇,小朋友’ ,如果输入了其它数据,提示 ‘您的输入有误’
age = input('请输入你的年龄')
if age.isdigit():
print("恭喜你,成年了" if int(age)>18 else "你好哇,小朋友" )
else:
print("您输入格式有误")
- 请搭建一个简易版本的逻辑管理系统1.需要用户输入姓名,身份证号以及电话号码。2.如果用户选择打印出输入的信息,则打印输出”欢迎*同学加入逻辑,您的身份证号是*,您的电话是*。我们将诚心为您服务”。否则输出”感谢您使用该系统”。(注意这一块会使用到简单的条件判断语句,根据课堂上讲解的知识够用,字符串拼接大家可以使用多种方式)
print('*'*6,'这里是逻辑管理系统','*'*6)
name = input('请输入您的姓名:')
id_card = input('请输入您的身份证号码:')
tel = input('请输入您的手机号码:')
yes_or_no = input('请问您需要打印出来吗?请输入Y/N:')
if yes_or_no.upper() == 'Y' and len([id_card,name,tel]) == [15,6,11] :
print(f'欢迎:{name}加入逻辑管理系统\n您的身份证号码是:{id_card}\n您的电话是:{tel}\n
我们将竭诚为您服务!')
else:
print('信息输入有误,请重新输入!')
- 实现:输入所在地址,打印输出 “我在**,为湖北加油!”
addr = input('请输入我的地址')
print(f'我在:{addr}\n 我为武汉加油!' if addr.isalpha() else f'我在:中国\n 我为武汉加油!')