黑马程序员复习Python 争取做个小项目

学习主要内容

01 linux基础
02 Python基础
03 Python面向对象
04 项目实战

课程安排: Linux基础, 1到100
python基础, 101到160 简介 161到360 主体
python面向对象及高级, 361到460
开始项目, 461到508

操作系统

image.png

image.png

linux 命令

image.png

  • rm -r filename 可以删除文件夹。
  • touch 可以快速创建空文件。
  • image.png

    文件和目录的常用命令

    image.png
    image.png

  • grep -n abc 1.txt 查找1.txt里面有没有abc 这个字符,并显示行号

  • -i 忽略大小写
  • -v 对你写的字符串取其他值
  • 正则表达式 ^a abd$

image.png

  • 管道操作常和 grep 搭配使用。

    远程管理命令

  • shutdown

    • 关机 shutdown now
    • 重启 shutdown -r now
    • 不指定now 默认一分钟关机。
    • shutdown -c 可以取消关机
  • ifconfig
    • ifconfig | grep inet 就能方便的查询 ip 地址
  • ping www.baidu.com
  • ssh
    • image.png
  • scp 分发文件

    • image.png

      用户权限相关命令

      image.png
      第一组权限对应文件的拥有者,见下。
      1. [root@lxl documents]# ll
      2. 总用量 4
      3. -rw-r--r-- 1 root root 4 6 28 15:11 1.txt
      image.png
  • chomd +/- rwx 文件名/文件 进行修改权限

  • 如何执行一个 py文件?
    • 服务器 安装好anaconda之后,它的路径是 /root/anaconda3/bin/python
    • image.png
    • 之后执行,./1.py 即可。
  • 如果一个文件夹没有 x 权限,那么就不能cd 到这个文件夹里面。
  • 如果文件夹没有可读权限,那么可以cd 到文件夹,但是ls 无法执行。
  • 如果文件夹没有可写权限(其他两个权限都有),可以cd 到文件夹,可以 ls查看文件,但是不能新建文件。

    系统信息常用命令

    image.png

    其他命令

  • ubuntu 系统的软件安装和centos 不一样

image.png

Python

image.png
编译型语言:C C++ 不能处处运行
解释型语言:Java Python 可以在不同的操作系统按照不同的解释器,进而实现跨平台运行
image.png

打开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

image.png
image.png
image.png

Python变量

判断语句

循环语句

函数

模块

所有的 .py 文件都可以看成模块

高级变量类型

  • 列表
  • 元组
  • 字典
  • 字符串
  • 公共方法
  • 变量高级

    列表

    常用方法

元组

  • 不可修改
  • 定义一个只包含一个数字的元组怎么写?

    • a_tuple = (5,)

      综合应用-名片管理系统

      image.png
  • cards_main 作为程序的入口。

  • cards_tools 保存名片功能函数。
    • 对名片的新增、查询、修改、删除

image.png
image.png

  • 程序在linux上的运行

    对变量的进阶理解

    image.png
    image.png
    此之谓“引用”
    image.png

    可变和不可变数据类型

    image.png

  • 数字是不可变类型怎么理解?

    • 一旦在内存中分配了地址,这个地址就不能变成别的内容了。
  • 可变类型就是说,我们可以通过函数调用来修改列表或者字典的内容,但是其内存地址不变。
  • 字典中的key 只能使用不可变类型!
    • image.png
    • image.png
  • image.png

    • image.png

      局部变量和全局变量

      image.png
  • 使用 global 可以修改全局变量

    函数参数与返回值

    返回值

    image.png

image.png

  • 返回数据是元组,括号可以省略
  • 也可以使用多个变量进行接收

    参数传递

    image.png

  • 代码第7行,函数内部是赋值语句,不会修改外部数据

image.png

  • 传递的参数是可变类型-列表,同时在函数内部使用方法修改了列表的值,外部数据会改变。

    缺省参数

  • 具有默认值的参数就叫做缺省参数

  • 缺省参数的定义位置必须在最后。
  • 如果有多个默认值,而自己想修改某个默认值,需要在调用函数的时候 带上 参数='参数值'

image.png
image.png
image.png
image.png

  • 在调用函数的时候,使用 和两个* 就叫做拆包语法

    递归

    image.png

  • 到达递归函数出口后,会跳转到上一步递归的位置继续执行,所以最后还会打印 完成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()

image.png

class Cat:
    def drink(self):
        print('%s 要喝水' % self.name)

    def eat(self):
        print('小猫爱吃鱼')


cat = Cat()
cat.name = 'Tom' # 在类外部定义   不推荐使用
cat.drink()
cat.eat()

image.png

初始化方法

前面在类的外部定义属性的方法并不好。
image.png
image.png
image.png

  • init 里面设置 name 属性。

image.png
image.png

  • 这个时候打印的是 tom 的地址
  • 定义 str方法,在里面写上类的信息。 ```python class Cat: def init(self, name):
      self.name = name
    
    def drink(self):
      print('%s 要喝水' % self.name)
    
    def eat(self):
      print('小猫爱吃鱼')
    
    def str(self) -> str:
      return '猫的名字是 %s' % self.name
    
    cat = Cat(‘Tom’) cat.drink() cat.eat() print(cat)

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)

【案例】
image.png

  • 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
  • image.png
  • 在子类里面重写函数,就会自动调用子类的方法,不会调用父类的方法。
  • 【2】扩展:使用 super().调用父类的方法,然后去写其他特有的子类代码。

image.png

多继承

image.png

多态

image.png