python编程基础
1、什么是编程语言?
编程语言是用来控制计算机的一系列指令(Instruction),它有固定的格式和词汇(不同编程语言的格式和词汇不一样),必须遵守,否则就会出错,达不到我们的目的。
习惯上,我们将这一条条指令称为代码,这些代码共同组成一个计算机程序,而用编程语言来编写程序的过程称为编码。
使用编译器将自身转换成机器语言的高级语言,通常称为编译型语言;而使用解释器将自身转换成机器语言的高级语言,称为解释型语言,Python 就是一种解释型编程语言。
2、编译型语言与解释型语言的区别?
-
有的编程语言要求 必须提前将所有源代码一次性转换成二进制指令,也就是生成一个可执行程序(比如 Windows 下的 .exe 文件),比如C语言、C++、Golang、汇编语言等,它们都属于编译型语言,使用的转换工具称为编译器。
-
有的编程语言可以一边执行一边转换,需要哪些源代码就转换哪些源代码,不会生成可执行程序。
比如 Python、JavaScript、PHP、Shell 等,这类编程语言称为解释型语言,使用的转换工具称为解释器。
简单地理解,编译器和解释器其实就是一个“翻译工具”。
除编译型和解释型语言外,还有一种半编译半解释型语言,比如 Java和 C# 等,这类语言将源代码先转换成一种中间文件(字节码文件),然后再将中间文件拿到虚拟机中执行。
编译型语言特点:
- 一次编译,无限次运行
- 可执行程序不能跨平台。
- 源代码不能跨平台。
- 执行效率高。一般闭源。
- 可移植性差,不够灵活。
解释型特点:
- 效率较低,且是数量级差距。
- 一般开源。
- 一次编写,到处运行。
- 一边执行一边转换,效率较低。
3、python特点:
Python 是一种开源的解释型脚本编程语言,它之所以非常流行,主要有三点原因:
- Python 简单易用,学习成本低,看起来非常优雅干净;
- Python 标准库和第三库众多,功能强大,既可以开发小工具,也可以开发企业级应用;
- Python 站在了人工智能和大数据的风口上,站在风口上,猪都能飞起来。
优点:
- 语法简单。
- 具有伪代码的特点。(伪代码必须结构清晰、代码简单、可读性好,并且类似于自然语言。)
- 开源、免费、高级语言。
- 面向对象、能跨平台、模块多(第三方库)、可扩展性强。
缺点:
- 运行数度慢;
- 代码加密困难。
4、python应用领域:
- web开发(Django、Flask)
- 自动化运维。
- 网络爬虫。
- 人工智能
- 科学计算
- 游戏开发。
python是严格区分大小写的。
# 编程之歌
print(" "*5+"程序员之歌")
print(" "*15+"——《江城子》改编\n")
print("十年生死两茫茫,写程序,到天亮,")
print("千行代码,Bug何处藏。")
print("纵使上线又怎样,朝令改,夕断肠。")
print("领导每天新想法,天天改,日日忙。")
print("相顾无言,惟有泪千行")
print("每晚灯火阑珊处,程序员,加班狂。")
5、变量:
1、python注释:
注释用来向用户提示或解释某些代码的作用和功能,它可以出现在代码中的任何位置。
-
单行注释:#
# 这是单行注释
-
多行注释:三个连续的双引号或 单引号
""" 使用 3 个双引号分别作为注释的开头和结尾 可以一次性注释多行内容 这里面的内容全部是注释内容 """
注意:多行注释中不可以嵌套多行注释。
2、缩进:
python 采用代码缩进和冒号( : )来区分代码块之间的层次。
- 注意,Python 中实现对代码的缩进,可以使用空格或者 Tab 键实现。
- 一个 Tab 键就表示 4 个空格。
- Python 对代码的缩进要求非常严格,同一个级别代码块的缩进量必须一样,否则解释器会报 SyntaxError 异常错误。
3、编程规范:
Python 采用 PEP 8 作为编码规范。
- 每个 import 语句只导入一个模块,尽量避免一次导入多个模块。
- 不要在行尾添加分号,也不要用分号将两条命令放在同一行。
- 建议每行不超过 80 个字符,如果超过,建议使用小括号将多行内容隐式的连接起来,而不推荐使用反斜杠 \ 进行连接。
- 使用必要的空行可以增加代码的可读性。
- 在运算符两侧、函数参数之间以及逗号两侧,都建议使用空格进行分隔。
4、标识符与命名规范:
标识符 主要作用就是作为变量、函数、类、模块以及其他对象的名称。
- 标识符是由字符(A~Z 和 a~z)、下划线和数字组成,但第一个字符不能是数字。(中文也可以,但是不推荐)。
- 标识符不能是python中的关键字。
- Python中的标识符中,不能包含空格、@、% 以及 $ 等特殊字符。
# 查看python中的关键字
help("keywords")
False class from or
None continue global pass
True def if raise
and del import return
as elif in try
assert else is while
async except lambda with
await finally nonlocal yield
break for not
标识符的命名,除了要遵守以上这几条规则外,不同场景中的标识符,其名称也有一定的规范可循,例如:
- 当标识符用作模块名时,应尽量短小,并且全部使用小写字母,可以使用下划线分割多个字母,例如 game_mian、game_register 等。
- 当标识符用作包的名称时,应尽量短小,也全部使用小写字母,不推荐使用下划线,例如 com.mr、com.mr.book 等。
- 当标识符用作类名时,应采用单词首字母大写的形式。例如,定义一个图书类,可以命名为 Book。
- 模块内部的类名,可以采用 “下划线+首字母大写” 的形式,如 _Book;
- 函数名、类中的属性名和方法名,应全部使用小写字母,多个单词之间可以用下划线分割;
- 常量命名应全部使用大写字母,单词之间可以用下划线分割;
5、内置函数:
Python解释器自带的函数叫做内置函数,这些函数可以直接使用,不需要导入某个模块。
内置函数
注意,不要使用内置函数的名字作为标识符使用(例如变量名、函数名、类名、模板名、对象名等),虽然这样做 Python 解释器不会报错,但这会导致同名的内置函数被覆盖,从而无法使用。
6、变量的使用:
n = 10
print(n) #将变量传递给函数
m = n * 10 + 5 #将变量作为四则运算的一部分
print(m)
print(m-30) #将由变量构成的表达式作为参数传递给函数
m = m * 2 #将变量本身的值翻倍
print(m)
url = "http://c.biancheng.net/cplus/"
str = "C++教程:" + url #字符串拼接
print(str)
python 是弱类型语言。
- 变量无须声明就可以直接赋值,对一个不存在的变量赋值就相当于定义了一个新变量。
- 变量的数据类型可以随时改变,比如,同一个变量可以一会儿被赋值为整数,一会儿被赋值为字符串。
- type() 内置函数可以检测某个变量或者表达式的类型。
6、数据类型:
1、整型:
不管对于多大或者多小的整数,Python 只用一种类型存储,就是 int。
当所用数值超过计算机自身的计算能力时,Python 会自动转用高精度计算(大数计算)。
进制的表示:
- 十进制:0-9阿拉伯数字
- 二进制:0b 或者 0B开头。
- 八进制:0o 或者 0O开头。
- 十六进制:0f 或者 0F开头。
数字分隔符:为了提高数字的的可读性,Python 3.x 允许使用下划线_
作为数字(包括整数和小数)的分隔符。
click = 10_000_000
num = 14_900_400_000
print("python阅读量:", click) # python阅读量: 10000000
print("中国人口数:", num) # 中国人口数: 14900400000
2、浮点数:
浮点数和定点数是相对的:小数在存储过程中如果小数点发生移动,就称为浮点数;如果小数点不动,就称为定点数。
表示形式:
-
十进制形式:45.6、 56.2、 23.6等。
-
指数形式:2.1e5、 4e3等。
注意:只要写成指数形式就是小数,即使它的最终值看起来像一个整数。例如 4E3 等价于 4000,但 4E3 是一个小数。
Python 只有一种小数类型,就是 float。
num01 = 12.5
print(num01)
print(type(num01)) # float
num02 = 0.232132131231
print(num02)
print(type(num02)) # float
num03 = 0.000000000000000021
print(num03)
print(type(num03)) # float
num04 = -13.43232
print(num04)
print(type(num04)) # float
num05 = 12e6
print(num05)
print(type(num05)) # float
num06 = 1.2 * 5.5
print(num06)
print(type(num06)) # float
Python 能容纳极小和极大的浮点数。print 在输出浮点数时,会根据浮点数的长度和大小适当的舍去一部分数字,或者采用科学计数法。
复数(Complex)是 Python的内置类型,直接书写即可。
3、字符串:
python 中的字符串必须由双引号" "
或者单引号' '
包围。两者没有区别。
注意点:
- 在使用引号时,需要用转义字符:\
- 如果字符串内容中出现了单引号,那么我们可以使用双引号包围字符串,反之亦然。
字符串换行:
num = (20 + 3 / 4 +
2 * 3)
print(num) # 26.75
str = "hello world! hahaha" \
"my name is litianyuan" \
", is buliangshuai."
print(str) # hello world! hahahamy name is litianyuan, is buliangshuai.
str02 = ("你好,最近过的咋样?"
"很好啊。"
"好的,听说不良人第六季快出来了哎。"
"是吗,那得好好看看。"
"哈哈哈。")
print(str02) # 你好,最近过的咋样?很好啊。好的,听说不良人第六季快出来了哎。是吗,那得好好看看。哈哈哈。
上述代码中,字符串换行更推荐第二种括号()形式的方式。
在普通字符串或者长字符串的开头加上r
前缀,就变成了原始字符串。
str03 = r"你好啊\t ,是的,我很好。"
print(str03) # 你好啊\t ,是的,我很好。
str03 = r'I\'m xiaochuhe, nice to meet you.'
print(str03) # I\'m xiaochuhe, nice to meet you.
需要注意的是,Python 原始字符串中的反斜杠仍然会对引号进行转义,因此原始字符串的结尾处不能是反斜杠,否则字符串结尾处的引号会被转义,导致字符串不能正确结束。
4、bytes 类型:
bytes 是 Python 3.x 新增的类型,在 Python 2.x 中是不存在的。
字节串(bytes)和字符串(string)的对比:
- 字符串由若干个字符组成,以字符为单位进行操作;字节串由若干个字节组成,以字节为单位进行操作。
- 字节串和字符串除了操作的数据单元不同之外,它们支持的所有方法都基本相同。
- 字节串和字符串都是不可变序列,不能随意增加和删除数据。
#通过b前缀将字符串转换成 bytes
b3 = b'http://c.biancheng.net/python/'
print("b3: ", b3)
print(b3[3])
print(b3[7:22])
#为 bytes() 方法指定字符集
b4 = bytes('C语言中文网8岁了', encoding='UTF-8')
print("b4: ", b4)
#通过 encode() 方法将字符串转换成 bytes
b5 = "C语言中文网8岁了".encode('UTF-8')
print("b5: ", b5) # b5: b'C\xe8\xaf\xad\xe8\xa8\x80\xe4\xb8\xad\xe6\x96\x87\xe7\xbd\x918\xe5\xb2\x81\xe4\xba\x86'
bytes 类也有一个 decode() 方法,通过该方法可以将 bytes 对象转换为字符串。
#通过 decode() 方法将 bytes 转换成字符串
str1 = b5.decode('UTF-8')
print("str1: ", str1)
5、布尔类型:
True 和 False 是 Python 中的关键字,当作为 Python 代码输入时,一定要注意字母的大小写,否则解释器会报错。
布尔类型可以当做整数来对待,即 True 相当于整数值 1,False 相当于整数值 0。
在 Python 中,所有的对象都可以进行真假值的测试,包括字符串、元组、列表、字典、对象等。
bool = True + 1
print(bool)
bool02 = False + 1
print(bool02)
但是在实际应用中,尽量避免这样操作。
7、运算符:
1、input() 函数
input() 是 Python的内置函数,用于从控制台读取用户输入的内容。
input() 函数总是以字符串的形式来处理用户输入的内容,所以用户输入的内容可以包含任何字符。
name = input("请输入你的名字:")
print(name,type(name)) # str
age = int(input("请输入你的年龄:"))
print(age,type(age)) # int
用 Python 内置函数将字符串转换成想要的类型:
- int(string) 将字符串转换成 int 类型;
- float(string) 将字符串转换成 float 类型;
- bool(string) 将字符串转换成 bool 类型。
2、print() 函数
print() 函数完全可以同时输出多个变量。
语法格式:
print (value,...,sep='',end='\n',file=sys.stdout,flush=False)
- 从上面可以看出,value可以接收多个变量或值。
name = "萧楚河"
age = 21
email = "12345@qq.com"
print("姓名:",name,"年龄:",age,"邮箱:",email)
- 改变默认的分隔符,可通过 sep 参数进行设置。
print("姓名:",name,"年龄:",age,"邮箱:",email,sep="||")
# 姓名:||萧楚河||年龄:||21||邮箱:||12345@qq.com
- 在默认情况下,print() 函数输出之后总会换行。因为 print() 函数的 end 参数的默认值是“\n”,若不想换行,只需要重设end 参数即可。
print(40,'\t',end=" ")
print(50,'\t',end=" ")
print(60,'\t',end=" ") # 40 50 60
-
file 参数指定 print() 函数的输出目标,file 参数的默认值为 sys.stdout,该默认值代表了系统标准输出,也就是屏幕,因此 print() 函数默认输出到屏幕。
实际上,完全可以通过改变该参数让 print() 函数输出到特定文件中,例如如下代码:
f = open("demo.txt","w") # 打开文件以便写入
print('沧海月明珠有泪',file=f)
print('蓝田日暖玉生烟',file=f)
f.close()
- print() 函数的 flush 参数用于控制输出缓存,该参数一般保持为 False 即可,这样可以获得较好的性能。
3、格式化字符串
print() 函数使用以%
开头的转换说明符,对各种类型的数据进行格式化输出。
转换说明符只是一个占位符,它会被后面表达式(变量、常量、数字、字符串、加减乘除等各种形式)的值代替。
age = 21
print("我今年%d岁了。" %age) # 我今年21岁了。
格式化字符串可以包含多个转换说明符,这个时候也得提供多个表达式,用以替换对应的转换说明符;多个表达式必须使用小括号( )
包围起来。
age = 21
name = "萧楚河"
email = "12345@qq.com"
print("你好,我叫%s,今年%d岁,邮箱是:%s,有空记得找我玩。" %(name,age,email)) # 你好,我叫萧楚河,今年21岁,邮箱是:12345@qq.com,有空记得找我玩。
总之,有几个占位符,后面就得跟着几个表达式。并且,表达式需要一一对应。
当使用上述的转换说明符时,可以使用下面的格式指定最小输出宽度(至少占用多少个字符的位置):
- %10d 表示输出的整数宽度至少为 10;
- %20s 表示输出的字符串宽度至少为 20。
- 对于整数和字符串,当数据的实际宽度小于指定宽度时,会在左侧以空格补齐;
- 当数据的实际宽度大于指定宽度时,会按照数据的实际宽度输出。
num = 1234567
print("num(10):%10d." %num)
print("num(5):%5d." %num)
# num(10): 1234567.
# num(5):1234567.
指定对齐方式:
- | 指定左对齐 |
---|---|
+ | 表示输出的数字总要带着符号;正数带+ ,负数带- 。 |
0 | 表示宽度不足时补充 0,而不是补充空格。 |
- 对于小数,以上三个标志可以同时存在。
- 对于字符串,只能使用
-
标志,因为符号对于字符串没有意义,而补 0 会改变字符串的值。
n = 123456
# %09d 表示最小宽度为9,左边补0
print("n(09):%09d" % n)
# %+9d 表示最小宽度为9,带上符号
print("n(+9):%+9d" % n)
f = 140.5
# %-+010f 表示最小宽度为10,左对齐,带上符号
print("f(-+0):%-+010f" % f)
s = "Hello"
# %-10s 表示最小宽度为10,左对齐
print("s(-10):%-10s." % s)
指定小数精度:
对于小数(浮点数),print() 还允许指定小数点后的数字位数,也即指定小数的输出精度。
精度值需要放在最小宽度之后,中间用点号.
隔开;也可以不写最小宽度,只写精度。
%m.nf
%.nf
f = 3.141592653
# 最小宽度为8,小数点后保留3位
print("%8.3f" % f)
# 最小宽度为8,小数点后保留3位,左边补0
print("%08.3f" % f)
# 最小宽度为8,小数点后保留3位,左边补0,带符号
print("%+08.3f" % f)
3.142
0003.142
+003.142
4、转义字符
\n | 换行符,将光标位置移到下一行开头。 |
---|---|
\r | 回车符,将光标位置移到本行开头。 |
\t | 水平制表符,也即 Tab 键,一般相当于四个空格。 |
\a | 蜂鸣器响铃。注意不是喇叭发声,现在的计算机很多都不带蜂鸣器了,所以响铃不一定有效。 |
\b | 退格(Backspace),将光标位置移到前一列。 |
\ | 反斜线 |
’ | 单引号 |
" | 双引号 |
\ | 在字符串行尾的续行符,即一行未完,转到下一行继续写。 |
5、数据类型转换
函 数 | 作 用 |
---|---|
int(x) | 将 x 转换成整数类型 |
float(x) | 将 x 转换成浮点数类型 |
complex(real,[,imag]) | 创建一个复数 |
str(x) | 将 x 转换为字符串 |
repr(x) | 将 x 转换为表达式字符串 |
eval(str) | 计算在字符串中的有效 Python 表达式,并返回一个对象 |
chr(x) | 将整数 x 转换为一个字符 |
ord(x) | 将一个字符 x 转换为它对应的整数值 |
hex(x) | 将一个整数 x 转换为一个十六进制字符串 |
oct(x) | 将一个整数 x 转换为一个八进制的字符串 |
6、算数运算符:
- 加:+
- 减:-
- 乘:*
- 除(和数学中的规则一样):/
- 整除(只保留商的整数部分,向下取整)://
- 取余,即返回除法的余数:%
- 幂运算/次方运算,即返回 x 的 y 次方:**
注意:+ 不仅可以进行四则运算,还可以连接字符串。
a = 12
b = 10
sum = a + b
print(sum)
name = "中国惊奇先生"
cartoon = "动漫"
size = 15.6
str = "影片类型:" + cartoon + "影片名称:" + name + "影片大小:" + str(size) + "G"
print(str)
-
除了可以用作减法运算之外,还可以用作求负运算(正数变负数,负数变正数)。
*
除了可以用作乘法运算,还可以用来重复字符串,也即将 n 个同样的字符串连接起来。
str1 = "hello "
print(str1 * 4)
-
/
的计算结果总是小数,不管是否能除尽,也不管参与运算的是整数还是小数。 -
当有小数参与运算时,
//
结果才是小数,否则就是整数。 -
只有当第二个数字是负数时,求余的结果才是负数。换句话说,求余结果的正负和第一个数字没有关系,只由第二个数字决定。
-
%
两边的数字都是整数时,求余的结果也是整数;但是只要有一个数字是小数,求余的结果就是小数。
7、赋值运算符:
赋值运算符用来把右侧的值传递给左侧的变量(或者常量);可以直接将右侧的值交给左侧的变量,也可以进行某些运算后再交给左侧的变量,比如加减乘除、函数调用、逻辑运算等。
- = 和 == 是两个不同的运算符,= 用来赋值,而 == 用来判断两边的值是否相等。
n = 100
f = 25.2
n -= 80
print(n) # 20
f *= n-10
print(f) # 252.0
8、位运算符:
- 按位与运算符
&
的运算规则是:只有参与&
运算的两个位都为 1 时,结果才为 1,否则为 0。 - 按位或运算符
|
的运算规则是:两个二进制位有一个为 1 时,结果就为 1,两个都为 0 时结果才为 0。 - 按位异或运算
^
的运算规则是:参与运算的两个二进制位不同时,结果为 1,相同时结果为 0。 - 按位取反运算符
~
为单目运算符(只有一个操作数),右结合性,作用是对参与运算的二进制位取反。例如~1
为0,~0
为1。
9、比较运算符:
比较运算符,也称关系运算符,用于对常量、变量或表达式的结果进行大小比较。如果这种比较是成立的,则返回 True(真),反之则返回 False(假)。
== 用来比较两个变量的值是否相等,而 is 则用来比对两个变量引用的是否是同一个对象。
10、逻辑运算符:
在 Python 中,and 和 or 不一定会计算右边表达式的值,有时候只计算左边表达式的值就能得到最终结果。
另外,and 和 or 运算符会将其中一个表达式的值作为最终结果,而不是将 True 或者 False 作为最终结果。
对于 and 运算符,全真则为真。有假得假:
- 如果左边为假,那么就不用看右边了,因为不管右边是什么,最终结果都是假,此时 and 会把左边的值作为最终结果。
- 如果左边为真,那么最终值是不能确定的,and 会继续计算右边表达式的值,并将右边表达式的值作为最终结果。
对于 or 运算符,则是有真则真,全假为假:
- 如果左边为真,那么就不用看右边了,最终结果都是真,此时 or 会把左边表达式的值作为最终结果。
- 如果左边表达式的值为假,那么最终值是不能确定的,or 会继续计算右边表达式的值,并将右边表达式的值作为最终结果。
11、三目运算符:
假设现在有两个数字,我们希望获得其中较大的一个,那么可以使用 if else 语句,例如:
if a > b:
max = a
else:
max = b
三目运算符的写法为:
max = a if a>b else b
Python 三目运算符支持嵌套,如此可以构成更加复杂的表达式。
max = (a if a > c else c) if a > b else (b if b > c else c)
a = 12
b = 5
c = 30
max = (a if a > c else c) if a > b else (b if b > c else c)
print("最大值为:",max) # 30