学习主要内容
01 linux基础
02 Python基础
03 Python面向对象
04 项目实战
课程安排: Linux基础, 1到100
python基础, 101到160 简介 161到360 主体
python面向对象及高级, 361到460
开始项目, 461到508
操作系统
linux 命令
- rm -r filename 可以删除文件夹。
- touch 可以快速创建空文件。
-
文件和目录的常用命令
grep -n abc 1.txt 查找1.txt里面有没有abc 这个字符,并显示行号
- -i 忽略大小写
- -v 对你写的字符串取其他值
- 正则表达式 ^a abd$
-
远程管理命令
shutdown
- 关机 shutdown now
- 重启 shutdown -r now
- 不指定now 默认一分钟关机。
- shutdown -c 可以取消关机
- ifconfig
- ifconfig | grep inet 就能方便的查询 ip 地址
- ping www.baidu.com
- ssh
scp 分发文件
chomd +/- rwx 文件名/文件 进行修改权限
- 如何执行一个 py文件?
- 服务器 安装好anaconda之后,它的路径是 /root/anaconda3/bin/python
- 之后执行,./1.py 即可。
- 如果一个文件夹没有 x 权限,那么就不能cd 到这个文件夹里面。
- 如果文件夹没有可读权限,那么可以cd 到文件夹,但是ls 无法执行。
如果文件夹没有可写权限(其他两个权限都有),可以cd 到文件夹,可以 ls查看文件,但是不能新建文件。
系统信息常用命令
其他命令
ubuntu 系统的软件安装和centos 不一样
Python
编译型语言:C C++ 不能处处运行
解释型语言:Java Python 可以在不同的操作系统按照不同的解释器,进而实现跨平台运行
打开Python
终端输入 python python3 ipython ipython3 都可以。前提是安装好了anaconda,并配置好了路径。
[root@lxl documents]# echo $PATH
/home/itheima/.local/bin:
/home/itheima/bin:
/root/anaconda3/bin:
/usr/local/sbin:
/usr/local/bin:
/usr/sbin:
/usr/bin:
/root/bin
Python变量
判断语句
循环语句
函数
模块
高级变量类型
元组
- 不可修改
定义一个只包含一个数字的元组怎么写?
cards_main 作为程序的入口。
- cards_tools 保存名片功能函数。
- 对名片的新增、查询、修改、删除
-
对变量的进阶理解
可变和不可变数据类型
数字是不可变类型怎么理解?
- 一旦在内存中分配了地址,这个地址就不能变成别的内容了。
- 可变类型就是说,我们可以通过函数调用来修改列表或者字典的内容,但是其内存地址不变。
- 字典中的key 只能使用不可变类型!
-
函数参数与返回值
返回值
传递的参数是可变类型-列表,同时在函数内部使用方法修改了列表的值,外部数据会改变。
缺省参数
具有默认值的参数就叫做缺省参数
- 缺省参数的定义位置必须在最后。
- 如果有多个默认值,而自己想修改某个默认值,需要在调用函数的时候 带上
参数='参数值'
-
递归
到达递归函数出口后,会跳转到上一步递归的位置继续执行,所以最后还会打印 完成2和完成3。 ```python def sum_num(num): print(num)
if num == 1:
return
sum_num(num-1) print(‘完成 %d’ % num)
sum_num(3)
‘’’ 3 2 1 完成 2 完成 3 ‘’’
<a name="QkvDd"></a>
## 面向对象 OOP
<a name="UsLth"></a>
### 类和对象
- 类是抽象的。
- 特征称为属性;
- 行为是方法;
- 对象是类创建出来的一个具体存在。
![image.png](https://cdn.nlark.com/yuque/0/2022/png/22491924/1656468679750-348c346c-df57-419c-8194-ba090fdb883e.png#clientId=u6366aa54-da2e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=137&id=u6e90f263&margin=%5Bobject%20Object%5D&name=image.png&originHeight=189&originWidth=750&originalType=binary&ratio=1&rotation=0&showTitle=false&size=158371&status=done&style=none&taskId=u02910969-6992-43b0-8b24-b3c05384504&title=&width=545.4545454545455)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/22491924/1656468699441-006e2141-f5e2-4477-9fec-3cf2a8daebfa.png#clientId=u6366aa54-da2e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=197&id=ucebb93a1&margin=%5Bobject%20Object%5D&name=image.png&originHeight=271&originWidth=563&originalType=binary&ratio=1&rotation=0&showTitle=false&size=158207&status=done&style=none&taskId=u84f903f0-ab17-4e41-bcff-37b72037a3b&title=&width=409.45454545454544)
<a name="sCjAT"></a>
### 定义类
- 类的设计使用大驼峰命名。CatJump()
![image.png](https://cdn.nlark.com/yuque/0/2022/png/22491924/1656468768146-b2ad8655-5fab-4c25-acfd-8661e778bc27.png#clientId=u6366aa54-da2e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=317&id=u003a2c73&margin=%5Bobject%20Object%5D&name=image.png&originHeight=436&originWidth=907&originalType=binary&ratio=1&rotation=0&showTitle=false&size=330534&status=done&style=none&taskId=u7c39606b-469a-4794-a905-c6289cdac9c&title=&width=659.6363636363636)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/22491924/1656468981243-ff1834e3-45a6-41f9-b574-a0d52e19d93c.png#clientId=u6366aa54-da2e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=164&id=u60da3faa&margin=%5Bobject%20Object%5D&name=image.png&originHeight=225&originWidth=274&originalType=binary&ratio=1&rotation=0&showTitle=false&size=72168&status=done&style=none&taskId=u2225e795-6791-430d-ba34-1d86dbd06ed&title=&width=199.27272727272728)
- 可以使用dir 来查看函数或者变量的属性与方法。
- ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22491924/1656469064475-3f683456-3e28-4e80-9462-c0f49f38b0ce.png#clientId=u6366aa54-da2e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=117&id=ubc52d294&margin=%5Bobject%20Object%5D&name=image.png&originHeight=161&originWidth=1050&originalType=binary&ratio=1&rotation=0&showTitle=false&size=71153&status=done&style=none&taskId=uab8ec6b2-619b-4d23-8698-589a64f4581&title=&width=763.6363636363636)
先定义类,然后创建对象。class
```python
class Cat:
def drink(self):
print('小猫要喝水')
def eat(self):
print('小猫爱吃鱼')
cat = Cat()
cat.drink()
cat.eat()
class Cat:
def drink(self):
print('%s 要喝水' % self.name)
def eat(self):
print('小猫爱吃鱼')
cat = Cat()
cat.name = 'Tom' # 在类外部定义 不推荐使用
cat.drink()
cat.eat()
初始化方法
前面在类的外部定义属性的方法并不好。
- 在 init 里面设置 name 属性。
- 这个时候打印的是 tom 的地址
- 定义 str方法,在里面写上类的信息。
```python
class Cat:
def init(self, name):
def drink(self):self.name = name
def eat(self):print('%s 要喝水' % self.name)
def str(self) -> str:print('小猫爱吃鱼')
cat = Cat(‘Tom’) cat.drink() cat.eat() print(cat)return '猫的名字是 %s' % self.name
Tom 要喝水
小猫爱吃鱼
猫的名字是 Tom
<a name="IhWdX"></a>
### 封装
![image.png](https://cdn.nlark.com/yuque/0/2022/png/22491924/1656482960555-ccc3f041-cc1c-4a0b-92a7-b4a2eca056ac.png#clientId=u11d43b76-6c9e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=145&id=ud8645535&margin=%5Bobject%20Object%5D&name=image.png&originHeight=200&originWidth=668&originalType=binary&ratio=1&rotation=0&showTitle=false&size=164006&status=done&style=none&taskId=ue94723cb-c80e-42f5-9696-aed92bb5ac3&title=&width=485.8181818181818)
```python
class People:
def __init__(self, name, weight) -> None:
self.name = name
self.weight = weight
def __str__(self) -> str:
return '%s 的体重是%.2f' % (self.name, self.weight)
def run(self):
self.weight -= 0.5
# return self.weight
def eat(self):
self.weight += 1.0
# return self.weight
xiaoming = People('小明', 66)
print('%s 的当前体重是 %.2f' % (xiaoming.name, xiaoming.weight))
xiaoming.run()
print('%s 的当前体重是 %.2f' % (xiaoming.name, xiaoming.weight))
【案例】-家具
class House:
def __init__(self, house_type, area) -> None:
self.house_type = house_type
self.area = area
self.item_list = []
self.free_area = area
def __str__(self) -> str:
return '房型是%s,我的占地面积是%.1f,剩余面积是 %.1f,家具有 %s' % \
(self.house_type, self.area, self.free_area, self.item_list)
def add_item(self, item):
print('要添加%s' % item)
if self.free_area > item.area:
self.item_list.append(item.name)
self.free_area -= item.area
else:
print('%s的面积太大,无法添加' % item)
return
class HouseItem:
def __init__(self, name, area) -> None:
self.name = name
self.area = area
def __str__(self) -> str:
return '%s的占地面积是 %.1f' % (self.name, self.area)
bed = HouseItem('席梦思', 4)
chest = HouseItem('衣柜', 2)
table = HouseItem('餐桌', 1.5)
my_house = House('一室一厅', 90)
print(my_house)
my_house.add_item(bed)
print(my_house)
【案例】
gun 作为士兵的属性,也是另一个类创建的对象。 ```python class Solider: def init(self, name) -> None:
self.name = name self.gun = None
def fire(self):
# 判断有没有枪 if not self.gun: print('%s 没有枪' % self.name) else: print('有枪,请求发射!') self.gun.add_bullet(50) self.gun.shoot()
class Gun: def init(self, model) -> None: self.model = model self.bullet_count = 0
def add_bullet(self, count):
self.bullet_count += count
def shoot(self):
if self.bullet_count <= 0:
print('子弹数量不足,请补充弹药!')
else:
self.bullet_count -= 1
print('突突突,剩余子弹 %d' % self.bullet_count)
ak47 = Gun(‘AK47’)
ak47.add_bullet(10)
ak47.shoot()
wb = Solider(‘许三多’) wb.gun = ak47 wb.fire()
补充知识<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/22491924/1656486872552-88da7755-dea8-422c-9353-065a139fa1e9.png#clientId=u11d43b76-6c9e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=337&id=u7d383fce&margin=%5Bobject%20Object%5D&name=image.png&originHeight=463&originWidth=596&originalType=binary&ratio=1&rotation=0&showTitle=false&size=274740&status=done&style=none&taskId=ue82ac04a-f487-4a91-96b7-d57c7671aad&title=&width=433.45454545454544)
- == 和 is 的比较
<a name="DKf5y"></a>
### 私有属性和方法
![image.png](https://cdn.nlark.com/yuque/0/2022/png/22491924/1656486991267-132d4300-c309-4f61-9cd6-e62d1d422243.png#clientId=u11d43b76-6c9e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=432&id=u287f9af6&margin=%5Bobject%20Object%5D&name=image.png&originHeight=538&originWidth=672&originalType=binary&ratio=1&rotation=0&showTitle=false&size=328903&status=done&style=none&taskId=udffd9fd0-d5ab-4edb-bd1e-f02096467e1&title=&width=539.727294921875)
- 私有属性在外面不能直接访问 也就是不能 直接访问。但是类内部的方法内部可以访问。
- <br />
<a name="s6sLF"></a>
### 继承
- 为什么需要继承?
- 是对代码的复用。
![image.png](https://cdn.nlark.com/yuque/0/2022/png/22491924/1656487245536-9f02eab9-336e-4ef4-83cd-7d710b97a0f6.png#clientId=u11d43b76-6c9e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=478&id=ud0517d5c&margin=%5Bobject%20Object%5D&name=image.png&originHeight=598&originWidth=1189&originalType=binary&ratio=1&rotation=0&showTitle=false&size=256521&status=done&style=none&taskId=ue40dc9c3-089e-4639-a06f-f590b0a479e&title=&width=951.2)<br />继承:子类拥有父类的所有属性和方法<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/22491924/1656487526296-cb6158db-aaf5-4483-b5d5-d03bb4b4fc54.png#clientId=u11d43b76-6c9e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=422&id=u95f6351a&margin=%5Bobject%20Object%5D&name=image.png&originHeight=528&originWidth=746&originalType=binary&ratio=1&rotation=0&showTitle=false&size=414318&status=done&style=none&taskId=uf2827f9e-f1a3-47dd-9f64-d407b0f5746&title=&width=596.8)
```python
class Animal:
def eat(self):
print('吃')
def drink(self):
print('喝')
def run(self):
print('跑')
def sleep(self):
print('睡')
class Dog(Animal):
def bark(self):
print('叫')
dog = Dog()
dog.bark()
dog.drink()
dog.run()
dog.sleep()
方法的重写
- 当父类的方法不满足子类的需求时,子类需要对方法重写 override
- 在子类里面重写函数,就会自动调用子类的方法,不会调用父类的方法。
- 【2】扩展:使用 super().调用父类的方法,然后去写其他特有的子类代码。