Python入门第五天——[小甲鱼]零基础入门学习Python

2023-10-27

046 property方法的原理

  • property方法的原理

    • 描述符

      描述符就是将某种特殊类型的类的实例指派给另一个类的属性

      在这里插入图片描述

MyDecriptor就是x的描述符,所以MyDecriptor类就是一个描述符类(通常带有get,set和delete三种方法)

第一个参数是self必须得要的,表示this指针。

第二个参数是表示实例的拥有者,也就是当x = MyDecriptor()时,这个instance实例对象就是另一个类Test类

>>> class MyDecriptor:
	def __get__(self,instance,owner):
		print("getting",self,instance,owner)
	def __set__(self,instance,value):
		print("setting",self,instance,value)
	def __delete__(self,instance):
		print("deleting",self,instance)

>>> class Test:
	x = MyDecriptor()
	
>>> test = Test()
>>> 
>>> test.x
getting <__main__.MyDecriptor object at 0x000002A9341D82E0> <__main__.Test object at 0x000002A9341D8400> <class '__main__.Test'>
>>> test.x = "X-man" #test.x = "x-man":出现等号,就是赋值,就会调用set方法,前两个参数是一样的,第三个参数就是我们写的值value。
setting <__main__.MyDecriptor object at 0x000002A9341D82E0> <__main__.Test object at 0x000002A9341D8400> X-man
>>> del test.x
deleting <__main__.MyDecriptor object at 0x000002A9341D82E0> <__main__.Test object at 0x000002A9341D8400>
  • 所以实际Property就是这样实现的,我们自己利用描述符实现一个Property试试就可以知道了。

    在这里插入图片描述

  • 小练习

    在这里插入图片描述

  • 现在假设我设置fah = 100,这句出现了赋值号,那么fah这个属性有一个描述符类Fahrenheit,Fahrenheit也就是去描述fah这个属性的,当这个属性被赋值时,就会默认执行描述符类的__set__方法。然后他就去执行instance.cel = (float(value) - 32) / 1.8这句,因为instance就是实例对象Temperature,然后就调用它的属性cel,而cel的描述符类是Celsius,出现了= (float(value) - 32) / 1.8这个赋值符号,那么就会去执行Celsius描述符类的set方法,然后设置到他类的value里面。

    在这里插入图片描述

047 定制序列

也叫定制容器,但在定制容器之间,需要先了解协议:

在这里插入图片描述

  • 容器类型的协议

    • 如果说希望定制的容器是不可变的,那么**只需要定义__len__()和__getitem()**方法

    • 如果希望定制的容器是可变的话,除了__len__()和__getitem__()方法,还需要定义__setitem__()和__delitem__()两个方法

    • 容器类型的魔法方法:

      在这里插入图片描述

    • 小练习来验证

      在这里插入图片描述

      自定义一个容器类,写好构造方法,参数是可变数量的,在之前学过如果参数是可变数量的就需要写成*args的形式,我们不知道参数有多少,那么就先把他都放到一个列表里。要实现记录列表中每个元素被访问的次数,可以用字典来做,把列表中的下标作为字典的键,值就是对应的访问次数。

      在这里插入图片描述

048 迭代器

  • 提供迭代的容器,就叫做迭代器(字典,元组,列表,字符串)

  • 迭代操作,例如for循环,就可以迭代容器里面的内容。

    • 迭代字典

      在这里插入图片描述

  • Python提供了两个内置的迭代方法

    • iter()

      • 对于一个容器对象调用iter()返回的就是一个迭代器,迭代器调用next方法就会迭代下一个值。
    • next()

      • 如果迭代出没有元素,那么就会抛出StopIteration异常

        >>> string = "haha"
        >>> it = iter(string)
        >>> next(it)
        'h'
        >>> next(it)
        'a'
        >>> 
        >>> next(it)
        'h'
        >>> next(it)
        'a'
        >>> next(it)
        Traceback (most recent call last):
          File "<pyshell#44>", line 1, in <module>
            next(it)
        StopIteration
        >>> 
        
  • 我们的循环语句for语句实际内部是自动调用了迭代器的。使用while循环还原for语句:

    >>> while True:
    	try:
    		each = next(it)
    	except StopIteration:
    		print("迭代完了")
    		break
    	print(each)
    
    	
    h
    a
    h
    a
    迭代完了
    
  • 迭代器的魔法方法,他们对应的就是上面两个BIF的实现,如果一个容器如果是一个迭代器,那么必须实现iter的魔法方法和next魔法方法

    • __iter__()
    • __next__()

    写一个容器类:

    在这里插入图片描述

    在这里他会不断的一直迭代,因为没有条件限制,他就会一直执行下去。所以需要加条件

    在这里插入图片描述

049 生成器(乱入器)

定义:一旦函数里面出现了yield关键字,这个函数就被称之为生成器。

他是一种特殊的迭代器。生成器使得Python的协同程序得以实现。

  • 所谓协同程序就是可以运行的独立函数调用函数可以暂停或者挂起,并在需要的时候从程序离开的地方继续或重新开始。函数都是一条一条语句进行执行,执行完后该释放的变量就会被释放,而生成器可以暂时暂停,去执行其他程序,等到必要的时候又继续执行或重新开始。

  • 当我们调用这个生成器函数时,他执行到第一个yield,就暂停并将yield后面的值返回,当我们next这个生成器的时候他就会打印yield后面的值,有几个yield就可以next几次,超过则抛出stopiteration异常。

    具体实例:

    在这里插入图片描述

050 模块

是一种高级的封装。保存的是一个.py的程序就是一个独立的模块

  • 第一种模块导入的方式

    语法:

    Import模块名

    • 但是要使用模块里面的函数,则需要有命名空间的区别,因为不同的模块会出现相同的方法,为了避免冲突,就有了命名空间这个概念,也就是用模块名.方法,进行分别。

      在这里插入图片描述

    在这里插入图片描述

  • 第二种模块导入的方式

    语法:

    from 模块名 import 函数名

    • 这种方式导入的话就不需要命名空间了,就可以直接导入了。

    • 也可以直接导入模块中所有的函数:form 模块名 import *

      在这里插入图片描述

  • 第三种模块导入的方式(推荐使用)

    语法:

    import 模块名 as 导入的命名空间的新名字

    在这里插入图片描述

__name__=’__main__'搜索路径和包

  • 回顾模块的主要作用:

    1.封装代码

    2.实现代码的重用

  • if __name__==’__main__'

    • 因为在我们导入模块时,他是将整个python文件进行导入,所以当我们执行程序时,他会把整个文件的东西都执行一遍。

      例如:

      在这里插入图片描述

      在这里插入图片描述

    在这里插入图片描述

    那我们现在就想执行这两个方法,其他的都不执行,我们就应该让Python知道该模块是作为程序运行,还是导入到其他程序中。

    就可以用if __name__==’__main__'来进行判断是作为程序运行还是导入到其他程序中。

    这句话也就是判断当他不是作为导入模块时(作为程序运行时)才运行。

    在这里插入图片描述

    在这里插入图片描述

  • 搜索路径

    Python模块的导入需要一个路径搜索的过程,导入一个模块,他会在预订的搜索路径中去搜索这个路径中是否存在这个模块,这个路径有很多个,可以通过sys.path进行查看(记得先导入sys)

    在这里插入图片描述
    那么模块一般都存在哪个位置呢?

    一般都存在site-packages这个文件夹里,这个文件夹是专门用来放模块的。

​ 如果你的模块放在其他的路径中,你也可以使用sys.path.append方法添加路径

在这里插入图片描述

  • 包(apckage)

    因为可能我们的模块文件也会出现同名的情况,所以Python中有包的概念

    在这里插入图片描述

    • 一定要有一个__init__.py文件,因为是告诉Python这个文件夹是要当做包来进行管理,这个文件可以为空,但一定得有。

    • 导入包中的模块

      语法:

      import 包名.模块名

像一个极客去思考

  • Python自己带着电池:也即是说Python自己带着标准库

  • 用一种方法,最好是只有一种方法来做一件事

  • 像一个极客去思考问题

    • 跟学Java一样,看手册,看文档,尝试各种方法的使用
    • 还有就是可以使用Python的内置函数help进行方法的查看。

Python总结

  • 学Python的目的是为了更好地进行机器学习,不打算往深的方向走,例如爬虫、网络编程、GUI等,暂时学会基础语法,能看懂机器学习大佬写的代码,能自己动手实验就是我的目的。G4ubmV0L3FxXzQyMjYzNTUz,size_16,color_FFFFFF,t_70)
  • 等到有需要用Python做高级应用时再进行学习。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python入门第五天——[小甲鱼]零基础入门学习Python 的相关文章

随机推荐

  • SQL Lesson 8: 关于特殊关键字 NULLs

    SQL Lesson 8 关于特殊关键字 NULLs 在查询条件中处理 NULL 使用 在查询条件中处理 NULL SELECT column another column FROM mytable WHERE column IS IS N
  • 深度学习-LeCun、Bengio和Hinton的联合综述

    发表于 2015 06 01 07 10 8257次阅读 来源 Nature 17 条评论 作者 Yann LeCun Yoshua Bengio Geoffrey Hinton 深度学习 自然语言处理 计算机视觉 语音识别 geoffre
  • 跨平台原理:

    跨平台原理 Java中存在Java虚拟机 可以将JAVA程序翻译成对应平台可以执行的程序进行运行 Java程序可以一处编译 到处运行 即java编译时将 java文件转换为无关平台的字节码 class文件 而虚拟机将 class文件翻译给不
  • 分布式发布订阅消息系统—Apache Kafka

    1 什么是Kafka Kafka是一种高吞吐量的分布式发布订阅消息系统 它可以处理消费者规模的网站中的所有动作流数据 这种动作 网页浏览 搜索和其他用户的行动 是在现代网络上的许多社会功能的一个关键因素 这些数据通常是由于吞吐量的要求而通过
  • 基于ant design vue实现的多层菜单组件封装

    菜单组件 不同于树组件的是 树组件可以选很多个 而菜单组件只可以选择一个 这里放上我的源代码 current 是默认选择的节点 是一个数组current 5 3 1 默认选择的节点 openKeys是默认展开的节点 也是一个数组openKe
  • ajax无法发送json串,Ajax检索Json字符串,但无法将成功数据循环为对象

    我的项目是用d3 js绘制grahp 我发现了一些php代码 这绝对是我想要的 但我正在与C 和主场迎战所以我把它转换成asp net 首先 我想编写一些硬编码数据样本并使用d3 js绘制图像 以及该PHP项目的JavaScript代码 现
  • React Hook 之 useMemo及 React.memo

    一 useMemo const memoizedValue useMemo gt computeExpensiveValue a b a b 返回一个 memoized 值 把 创建 函数和依赖项数组作为参数传入 useMemo 它仅会在某
  • 2021泰迪杯数据分析技能赛B题-肥料登记数据分析

    调用模块 import numpy as np import pandas as pd import matplotlib pyplot as plt import seaborn as sns plt rcParams font fami
  • iic通信原理_血氧饱和度传感器MAX30102模块的原理及编程

    一 简介 MAX30102是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块 芯片 它集成了一个660nm红光LED 880nm红外光LED 光电检测器 光器件 以及带环境光抑制的低噪声电子电路 可通过软件关断模块 待机电流为零 实现电源始
  • OpenCV Mat类型及convertTo转换

    类型 在 Android OpenCv中给我们返回的 type 直接是 CV 8UC4 但是 在 C 中返回的是 16 等这些整型 所以 我找了个对照表 表头的 C1 C2 C3 C4 指的是通道 Channel 数 比如灰度图像只有 1
  • 获取当前访问的部分虚拟路径(Request.Url.GetLeftPart)

    Request Url GetLeftPart的应用 发送按钮
  • 2023牛寒2--Tokitsukaze and K-Sequence

    Tokitsukaze 有一个长度为 n 的序列 a 她想把这个序列划分成 k 个非空子序列 定义序列的值为这个序列中只出现一次的数字的个数 对于 k 1 n Tokitsukaze 想知道把序列 a 划分成 k 个非空子序列后 所有子序列
  • GCD->OC

    VHAsyncRun h VHAsyncRun h VHUpload Created by vhall on 2019 11 7 Copyright 2019 vhall All rights reserved typedef void V
  • 20230601

    20230703 mockito when 不生效 掘金 Java 单元测试 3 mock进阶 静态 final 私有方法mock 掘金 Mockito与PowerMock的使用基础教程 掘金 System out println Syst
  • Linux--数据链路层--ARP协议--0319-21

    目录 1 认识以太网 1 1 以太网帧格式 1 2 基于以太网帧简单模拟局域网通信 问题一 如果有多台主机都在发送数据呢 问题二 发送方知不知道自己的数据被影响了呢 1 3 MTU 1 3 1 MTU对IP协议的影响 1 3 2 MTU对U
  • C++之关联容器的erase使用

    对于关联容器 如map set multimap multiset 删除当前的iterator 仅仅会使当前的iterator失效 只要在erase时 递增当前的iterator即可 这是因为map之类的容器 使用了红黑树来实现 插入 删除
  • 软件工程提问回顾与个人总结

    项目 内容 作业所属课程 软件工程班级博客 作业要求请点击链接查看 作业要求 我在这个课程的目标 学习如何用工程化方法构建和维护软件 这个作业在哪个具体方面帮助我实现目标 通过回顾整个课程的学习 思考总结获得的收获 一 以前提问题的博客 提
  • Qt知识点梳理 —— 无边框图片背景窗体实现

    文章目录 实现效果 创建项目 项目源码 开发环境 实现效果 创建项目 首先创建项目 选择QMainWindow或者QWidget都可以 窗体中加入Layout 选择Vertical Layout或者Horizontal Layout都可以
  • Microsoft Office Word 2016关闭时无响应卡顿的解决方法

    1 在控制面板中找到Microsoft office 2 右键单击选择更改 3 尝试 Quick Rapair 4 等待修复 如果Quick Rapair修复完成还没有解决问题 选择Online repair 再尝试
  • Python入门第五天——[小甲鱼]零基础入门学习Python

    046 property方法的原理 property方法的原理 描述符 描述符就是将某种特殊类型的类的实例指派给另一个类的属性 MyDecriptor就是x的描述符 所以MyDecriptor类就是一个描述符类 通常带有get set和de