基本语法
- 注释
- 单行注释以
#
开头 - 多行注释 以
''' '''
三个单引号
- 单行注释以
- 对大小写敏感
print
输出,input
输入- print默认是换行输出
- 关键字
end
,将多个结果放在同一行输出,并指定多个结果之间的分隔符,如print(x, end=",")
print("x的值为:", x)
输出辅助文字
- 代码组,首行以关键字开始 以
:
结束,同一个代码组的每一行缩进相同
基本数据类型
- Number、String、List、Tuple(元祖)、Set(集合)、Dictionary(字典)
- Python中变量没有类型,以上所指的类型是变量在内存中的类型
- Python可以同时为多个变量赋值,如
a, b = 1, 2.5
数字 Number
- Python3中支持:int、float、bool、complex(复数,如
1+3i
) - 可以使用
type(a)
查看变量a的类型,或使用isinstance(a, int)
查看变量a的类型是int或int的子类 - Python3中增加的bool类型,其关键字True和False的值与1和0相同
- 除法
2 / 4
得到浮点数;2 // 4
得到整数;2 % 4
取余。2 ** 5
乘方 - 数字类型转换
int(a)
将a转化为整数float(a)
将a转化为浮点数complex(a)
将a转化为复数complex(a,b)
a为实部,b为虚部
字符串 String
- 对于字符串,单引号和双引号的使用相同
- 没有单独的字符类型,一个字符就是长度为1的字符串
- 字符串截取:变量名[头下标:尾下标:步长],且是左闭右开区间
[ )
(即不会输出尾下标元素) - 索引方式:从左至右以0开始;从右至左以-1开始
- 字符串可以用
+
连接,用*
运算符重复 - 使用
\
加一个特定字符表示转义,防止转义可以在字符串前加上r 或 R
,如r"hello\n Naka"
- 字符串的值不可以被改变
- 字符串的比较
>, <, >=, <=, ==, !=
列表 List
- 写在方括号
[]
中,用逗号分隔,每个元素数据类型可不一样 - 可以同字符串一样进行 索引、切片、串联
+
- 列表元素可改变
- 列表生成式
li = [ 2*i for i in range(10)]
元组 Tuple
- 写在小括号
()
中,逗号分隔,元素类型可不一样,有序 - 可以同字符串一样进行 索引、切片、拼接
+
- 元素不可改变,但元素可以包含可变数据类型List
- 空元组
tup = ()
;一个元素的元组tup = (1, )
需要加一个逗号 - 删除元组
del tup
- 查看长度
len(tup)
- 将列表转为元组
tuple(list)
集合 Set
- 集合是一个无序不重复的元素集,可用来消除重复元素
- 创建
a = set()
b = set('ajjjien')
c = {'a', 'b', 'c'}
- 基本操作
- 新增
add()
update()
- 删除
remove()
discard()
pop()
clear()
- 新增
- 是否是子集
s2.issubset(s1)
True
s2是s1的子集
- 是否是超集
s1.isseuperset(s2)
True
s1是s2的超集
- 是否有交集
s2.isdisjoint(s1)
有交集为 False - 数学运算
- 求交集
s1.intersetion(s2)
s1 & s2
- 求并集
s1.union(s2)
s1 | s2
- 求差集
s1.difference(s2)
s1-s2
- 对称差集
s1.symmetric_difference(s2)
s1 ^ s2
即并集减去交集
- 求交集
- 集合生成式
se = { i*i for i in range(10)}
字典 Dictionaries
- 字典是一种映射类型,由键值对组成,‘键’必须是不可变类型且不可重复
- 创建
a = {}
b = {'a':1109, 'b':0934}
- 访问
b['a']
- 添加
b['c'] = "Nakamura"
- 元素值可修改
- 删除元素
del b['a']
- 很多构建字典的方法。。。
- 一些内置函数
len(dict)
元素个数str(dict)
以字符串输出
数据结构 | 是否可变 | 是否可重复 | 是否有序 | 定义符号 |
---|---|---|---|---|
列表 List | 可变 | 可重复 | 有序 | [ ] |
元组 Tuple | 不可变 | 可重复 | 有序 | ( ) |
字典 Dictionary | 可变 | key不可重复 | 无序 | {key: value} |
集合 Set | 可变 | 不可重复 | 无序 | { } |
运算符
成员运算符
- in
- not in
身份运算符
条件控制
if elif else
if c1:
s1
elif c2:
s2
else:
s3
循环
for
for 一个东西 in 一个东西:
语句1
else :
语句2
range()函数,遍历数字序列 在一定数字范围内遍历
for i in range(5):
print(i)
输出 0 1 2 3 4
- 指定区间
range(2,6)
- 指定步长
range(3,9,2)
while
while c:
s
break continue
迭代器
函数
定义 创建
def func_name():
函数体
[return xxx]
变量的作用域
- 局部变量,定义在函数内部,若使用global声明 则变为全局变量
- 全局变量,定义在函数外部,可作用于函数内外
-
递归函数
定义
- 求斐波那契第n个数
1, 1, 2, 3, 5, 8...
```python普遍写法
def fib(n): if n == 1:
elif n == 2:return 1
else:return 1
fib(20)return fib(n-1) + fib(n-2)
我想的写法
a, b = 0, 1 def fibN(a, b, n): if n <= 2: return a+b return fibN(b, a+b, n-1)
print(fibN(0,1,20))
3. 返回多个值时以元组形式返回
<a name="JUqf5"></a>
# 类和对象
1. 定义。Python里面一切皆对象
1. 面向对象的三大特征:封装、继承、多态
1. 创建
1. Python将类属性设置私有是 在初始化函数内在该属性前加两个`_`
```python
class ClassName:
my_name = '悠一' # 类属性
def __init__(self, name, age): # 初始化
self.name = name
self.__age = age # 将age属性变为私有
def place(self): # 实例方法
print('Ty')
@staticmethod
def sm(): # 静态方法,没有默认参数,使用类名调用
print('wwww')
@classmethod
def cm(cls): # 类方法,使用类名调用
print('wo')
- 只创建一个类时,这个类也是一个对象 会被分配内存空间。
- 创建实例对象
cn = ClassName('yukkan',41)
- 调用方法
cn.place()
ClassName.place(cn)
。使用cn._ClassName__age
可以访问私有属性 - 动态绑定属性和方法
- 每个实例对象的属性和方法可以不同
cn.pet = 'neco'
- 内置函数
dir(对象名)
可以查看对象的所有属性
继承
- 语法:
class 子类(父类1, 父类2):
- 类默认继承
Object类
- 定义子类时,必须在其构造函数中调用父类的构造函数
class ClassName:
my_name = '悠一'
def __init__(self, name, age):
self.name = name
self.__age = age
def place(self):
print('Ty')
class Son(ClassName):
def __init__(self, name, age, car):
super().__init__(name, age) # 调用父类的构造函数初始化属性
self.car = car
重写
重写父类同名的方法 ```python class ClassName: my_name = ‘悠一’
def init(self, name, age):
self.name = name
self.__age = age
def place(self):
print('Ty')
class Son(ClassName): def init(self, name, age, car): super().init(name, age) self.car = car def place(self): super().place() # 调用父类的同名方法 print(“oosaka”)
<a name="Vt7kL"></a>
## 多态
1. 子类重写了父类的方法后,实现时 根据变量所引用的类型,动态决定调用哪个对象中的方法
```python
class Animal:
def eat(self):
print("an animal is eating")
class Dog(Animal):
def eat(self):
print("a dog is eating")
class Cat(Animal):
def eat(self):
print('a cat is eating')
class Human:
def eat(self):
print('a human is eating')
def test(obj):
obj.eat()
test(Animal())
test(Dog())
test(Cat())
test(Human())
类的特殊属性
对象.__dict__
可以查看该对象所绑定的属性及其值对象.__class__
查看该对象所属的类类.__bases__
查看该类的父类类.__mro__
查看该类的层次结构类.__subclasses__()
查看子类
特殊方法
- 将两个对象的属性相加
class Person():
def __init__(self, name):
self.name = name
def __add__(self, other):
return self.name+other.name
p1 = Person("sugita")
p2 = Person("kamayaki")
print(p1+p2)
深拷贝与浅拷贝
- 变量的赋值操作 定义了两个变量,实际上指向的是同一个对象(同一个地址)
- 浅拷贝 对象包含的内容不拷贝,只拷贝原对象
```python
class CPU:
pass
class Disk:
pass
class Computer:
def init(self, cpu, disk):
self.cpu = cpu
self.disk = disk
cpu1 = CPU() disk1 = Disk()
cpu2 = cpu1 # 赋值,两个对象指向同一个地址
computer1 = Computer(cpu1, disk1)
import copy computer2 = copy.copy(computer1) #浅拷贝 为computer2开辟了一个新的地址
浅拷贝之后,computer1和computer2所指向的地址不同,但它们的内容(cpu和disk)所指向的地址相同
3. **深拷贝** 使用copy模块中的deepcopy函数,递归拷贝对象中包含的子对象,源对象和拷贝对象所有的子对象也不相同
<a name="RVysP"></a>
# 模块
1. 以`.py`结尾的文件就是一个模块
1. 使用
1. 导入 `import 名称 [as 别名]` `from 模块名称 import 函数、变量、类`
3. 导入自己的模块方式 [链接](https://blog.csdn.net/qq_16069457/article/details/98791035)
<a name="E09sz"></a>
## 顶级模块
- 如果一个模块不是被导入到其他模块中执行,则它可能在解释器的顶级模块中执行。
- 每个模块的定义中都包括一个记录模块名称的变量`__name__`
- 若模块在顶级模块中执行,则`__name__ = '__main__'` ,这样可以判断该模块是否被其他模块调用而执行
```python
# module1.py
def add(a, b):
return a+b
if __name__ == '__main__':
print(add(20, 40))
- 当其他模块导入module1.py,且执行它的add函数时,该模块会被执行。当前加上了名称判断,if语句模块中的部分只有在 module1.py 被点击执行时才执行
包 package
- 包是将一组功能相近的模块的组合
- 包中包含了
__init__.py
文件 包的导入
import 包.模块
from 包 import 模块
Python的内置模块
sys time os calendar urllib json re math decimal logging
第三方模块
- 安装
pip install 模块名