学习python第一篇博客,记录python的基础语法
1、python简介
Python由荷兰数学和计算机科学研究学会的Guido van Rossum 于1990 年代初设计,作为一门叫做ABC语言的替代品。 Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。 Python解释器易于扩展,可以使用C或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python 也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器码。
2、python的使用
有两种方式:
- 交互式:即时得到程序的运行结果,多用于调试
- 脚本方式:程序写到文件里,用python解释器执行。
python
文件默认是ASCII
编码,写中文会报错,可以在首行加入#coding=utf-8
3、python虚拟环境创建
python在使用时会把所需要的包都pip到一起,多个项目的时候容易受到影响,这个时候就需要使用虚拟环境
了,虚拟环境就是把python
拷贝出来一份,一个项目在这个里面执行,并不会直接下载到核心的元python文件夹里。
VSCODE创建虚拟环境
- 安装
python
插件 - 创建个文件vscode打开
- 打开终端输入
python3 -m venv .venv
- 会提示是否使用新的虚拟环境,直接使用就好了
vscode中使用run code
插件的话需要额外配置python运行的版本,在插件的扩展设置里面设置
"python": "set PYTHONIOENCODING=utf8 && python3 -u",
4、第一行代码
print('hello world')
使用vscode,右键run code
5、 变量
python中变量的值有三个重要的特征
- id:反映的是变量值的内存地址,内存地址不同的id不同
- type:不同类型的值用来表示变量值的不同状态
- value:值本身
比较变量值可以使用is
或者==
is
比较的是两个值的身份id
是否相等,也就是是否是一个内存地址的变量(类似js的引用类型对比) x is y
==
比较的是值本身是否相对(普通的值比较) x == y
id不同,值可能相等,因为两块不同的内存空间可以存相同的值 id相同,值一定相等。
5.1 小整数池
从python解释器启动的那一刻起,就会在内存中事先申请好一系列内存空间,存放着常用的整数,用于优化内存,相同的值就不需要再申请额外的内存空间。
范围:[-5, 256]
,注意:编辑器的终端会进行优化。
6、常量
python中没有常量,但是会涉及常量概念。虽然有个概念,但是就是没有常量的,没有const。约定所有的字母都是大写的变量为常量
。
7、数据类型
7.1 数字类型
支持四种:
- 整型
int
- 长整型
long int
- 浮点型
float
- 复数
complex numbers)
age = 22
print(type(age)) # <type 'int'>
age = 3.141592653
print(type(age)) # <type 'float'>
7.2 字符串 str
就是字符串
str = '一串字符串'
print(type(str)) # <type 'str'>
# 字符串嵌套
str = '小串里面有\'小串\',这就需要转译' # 小串里面有'小串',这就需要转译
# 奇怪操作
str = '=' * 10 # ===========
7.3 列表类型 List
注意不是数组,python中没有数组类型,取而代之的是列表和元组,列表比元组好用,因为元组一旦定义就没法修改。而列表不仅可以和数组一样按索引访问,还有一堆的功能,列表存的每个值都可以不同,可以动态改变,元组只能存同一种类型的值,且不能改变。
list1 = ['physics', 'chemistry', 1997, 2000]
list2 = [1, 2, 3, 4, 5, 6, 7 [8, 9]]
print("list1[0]: ", list1[0]) # ('list1[0]: ', 'physics')
# 取出多个
print("list2[1:5]: ", list2[1:5]) # ('list2[1:5]: ', [2, 3, 4, 5])
# 后面拿
print(list1[-1]) # 2000
# 删除
del list1[0]
# 追加
list1.append('222')
# 插入
list1.insert(1, 'insert')
# 删除特定的一项
list1.remove(1997)
# 扩展 将2追加到1后面
list1.extend(list2)
# 统计某一项出现的次数
list2.count(1)
# 排序 默认从小到大 相反的话list2.sort(reverse=Ture)
list2.sort()
# 翻转
list2.reverse()
# 根据给定的值获取索引
list2.index(2)
# 移除一个值
list2.pop()
列表的函数:
cmp(list1, list2)
: 比较两个列表的元素len(list)
: 列表元素的个数max(list)
: 列表里的最大值min(list)
: 列表里的最小值list(seq)
: 将元祖转换为列表
7.4 字典类型
字典是键值对存在的
d = {
'a': 1,
'b': 2
}
print(d['a'])
7.5 布尔类型
isOk = True || False
8、CG 垃圾回收机制
- 引用计数:引用一次+1,释放一个-1,会有循环引用的问题
- 标记清除:首先标记对象(垃圾检测),然后清除垃圾(垃圾回收)
- 分代回收:对象存在时间越长,越可能不是垃圾,应该越少去收集。
9、用户输入
我们可以通过input()
来让用户输入,方法返回用户输入的内容,转换成字符串
userInput = input('请输入:')
print(userInput)
python2中的raw_input()
方法和python3的input()
方法表现一致,python2中的input()
方法要求用户输入明确的数据类型,输入什么类型就存什么类型。
10、输出
print
在 Python3.x 是一个函数,但在 Python2.x 版本不是一个函数,只是一个关键字。
print()
接受多个参数
- objects – 复数,表示可以一次输出多个对象。输出多个对象时,需要用 , 分隔。
- sep – 用来间隔多个对象,默认值是一个空格。
- end – 用来设定以什么结尾。默认值是换行符 \n,我们可以换成其他字符串。
- file – 要写入的文件对象。
- flush – 输出是否被缓存通常决定于 file,但如果 flush 关键字参数为 True,流会被强制刷新。
print('xxxx')
还可以进行格式化输出,有四种方式
- %
- str.format
- f-Strings
- 标准库模板
%
号格式化字符串从python诞生就存在
# 默认按照位置传,一一对应
res = "my name is %s" %('名字')
print(res)
# 可以传个字典类型,通过key获取
res = "my name is %(name)s" %{'name': '名字'}
print(res)
# %d 只能接受数字
print("后面跟d的话只能接受数字: %d" %222)
str.format
是python2.6中引入的
# 按位置获取
res = "my name is {name}".format('名字')
print(res)
# 按key获取
res = "my name is {name}".format(name='名字')
print(res)
# 按索引获取
res = "my name is {0}".format('名字')
print(res)
# 解构获取
name = {
'name': '名字',
'age': '22'
}
res = "my name is {name}, age is {age}".format(**name)
print(res)
f-string
是python3.5之后有的
name = input("请输入名字")
age = input("请输入年龄")
res = f'我的年龄是{age}, 我的名字是{name}'
print(res)
以上三种运行速度最快的是f-string
,其次是format
,最后是%
11、运算符
- 算术运算符:加减乘除 取模(%) 幂(**),其他还有
//
取整除,只保留整数部分 - 赋值运算符:
=
- 增量赋值:
+=
:age += 1
, 其余类似*= /= ...
- 链式赋值:
x = y = 20
- 交叉赋值:
n,m = m, n
- 解压赋值:
num1, num2 = [1,2]
- 比较运算符:
>、 <、 >=、 <=、 ==、 !=
-
逻辑运算符:not取反 not 20 > 10 => False
and逻辑与 2>1 and 4>3 => True
or逻辑或 4>3 or 3>4
, 优先级:not > and > or
- 成员运算符:
in
,判断是否存在'a' in 'a, b' => Ture
- 身份运算符:
is
, 判断id是否相等,判断内存地址是否相等
12、流程控制
if
判断
if 6<3:
print("true")
elif:
print('...')
else:
print("false")
while
循环
num1 = 5
num2 = 1
while num1 >= num2:
print("成立")
num2 += 1
# 跳出循环
num1 = 2
while True:
print(num1)
if num1 == 5:
print('num1')
break
else :
print('err2')
num1 += 1
print('==================')
# 第二种方式
count = 0
while count < 6:
if count == 4:
count += 1
continue
print(count)
count += 1
# else
count = 0
while count < 6:
count += 1
print(count)
else:
print('while正常结束后会执行else')
for
循环
for x in [1,2,3,4]:
print(x)
for x in [1,2,3,4]:
print(x)
else:
print('ok')
12.1 for和while的区别
- 相同点:都是循环,for循环可以干的事儿,while都可以,都可以结合
break
,continue
,else
结合使用 - 不同点: while循环为
条件循环
,循环次数取决于条件的状态,for循环为迭代循环
,取决于迭代的值的个数
12.2 range()
range()方法:
- python2.x range() 函数可创建一个整数列表,一般用在 for 循环中。
- Python3 range() 返回的是一个可迭代对象(类型是对象),而不是列表类型,这个对象只占一个内存地址,当需要的时候临时创建值,而不是一直存储在内存中
13、深浅拷贝
# 浅拷贝 把源列表第一层的内存地址不加区分完全拷贝一份给新列表 可变类型的内存地址没有发现变化
list1 = [1, 2, 3, {a: 1}]
list2 = list1.copy()
# 深拷贝 使用第三方库 可变类型的内存地址也发生改变,是一个全新的值
import copy
list3 = copy.deepcopy(list1)