鱼C论坛

 找回密码
 立即注册
查看: 4993|回复: 31

[见证历程] 我的python自学路

[复制链接]
发表于 2020-2-18 11:55:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天开始记录每天学习的python内容。
2020/2/18

属性访问
1,__gerattr__(self,name)      #定义当用户试图获取一个不存在的属性时的行为
2,__getattribute__(self,name) #定义当该类的属性被访问时的行为
3,__setattr__(self,name,value) #定义当一个属性被设置时的行为
4,__delattr__(self,name)#定义当一个属性被删除时的行为


注意:死循环陷阱

例题:写一个矩形类,默认有宽和高两个属性。如果为一个叫square的属性赋值,那么说明这是一个正方形,值就是正方形的边长,此时宽和高都应该等于边长。
代码:
class Rectangle:
        def __init__(self,width=0,height=0):
                self.width = width
                self.height = height
        def __setattr__(self,name,value):
                if name == "square":
                        self.width = value
                        self.height = value
                else:
                        #self.name = value    #这里的name 其实是上面的width,所以会一直自己调用自己,是错误用法
                        #更改后
                        #super().__setattr__(name,value) #调用基类
                        self.__dict__[name] = value #设成字典形式
        def getArea(self):
                return self.width  *  self.height

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-18 11:58:51 | 显示全部楼层
好好加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-18 12:36:08 | 显示全部楼层
加油!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-19 09:41:24 | 显示全部楼层
本帖最后由 狐狸1 于 2020-2-19 10:03 编辑

2020/2/19
描述符(property)的原理

*描述符就是将某种特殊类型的类的实例指派给另一个类的属性
*特殊类型的类要实行以下三种方法中的一个或多个方法:
*__get__(self,instance,owner)    #用于访问属性,它返回属性的值
*__set__(self,instance,value)       #将在属性分配操作中调用,不返回任何内容
*__delete__(self,instance)          #控制删除操作,不返回任何内容

例子:
class MyDecriptor:
   
        def __get__(self,instance,owner):
                print('getting',self,instance,owner)
               
        def __set__(self,instance,value):
                print('settting',self,instance,value)
               
        def __delete__(self,instance):
                print('deleting',self,instance)

class Text:
    x = MyDecriptor()

text = Text()

text.x
text.x = 'X-main'
del text.x

#输出结果为:

getting <__main__.MyDecriptor object at 0x03525F70> <__main__.Text object at 0x033DAE08> <class '__main__.Text'>
settting <__main__.MyDecriptor object at 0x039DB5B0> <__main__.Text object at 0x03A25F70> X-main
deleting <__main__.MyDecriptor object at 0x039DB5B0> <__main__.Text object at 0x03A25F70>


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-19 10:30:50 | 显示全部楼层
本帖最后由 狐狸1 于 2020-2-19 10:45 编辑

将华氏度转换成摄氏度

代码:
class Celsius:
    def __init__(self,value=26.0):
        self.value = float(value)

    def __get__(self,instance,owner):
        return self.value

    def __set__(self,instance,value):
        self.value = float(value)
        
class Fahrenheit:
    def __get(self,instance,owner):
        return instance.cel * 1.8 + 32
    def __set__(self,instance,value):
        instance.cel = (float(value) - 32) / 1.8

class Temperature:
    cel = Celsius()
    fah = Fahrenheit()
#结果出现问题
temp.fah = 100
temp.cel
37.77777777777778
#华氏度能顺利转化为摄氏度
temp.cel = 37
>>> temp.fah
<__main__.Fahrenheit object at 0x03F320D0>

#摄氏度未能顺利转化为华氏度

思考:当我输入temp.cel = 37时,调用了Celsius的__set__()方法,self.value被赋值37(浮点数),然后我再调用temp的fah属性,此时是调用了Fahrenheit的__get__()方法,应调用成功,但结果却并不如意
进来看的鱼友能帮忙解答一下吗?


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-19 11:14:56 | 显示全部楼层
2020/2/19
定制序列

*容器类型的协议
*如果说希望定制一个不可变的容器,只需定义__len__()和__getitem__()方法。
*如果希望定制的容器是可变的,除了__len__()和__getitem__()方法,还需定义__setitem__()和__delitem__()两个方法。

练习:编写一个不可改变的自定义列表,要求记录列表中每个元素被访问的次数

#一个介绍推导式的博客链接:https://www.cnblogs.com/tkqasn/p/5977653.html

class CountList:
    def __init__(self,*args):
        self.values = [x for x in args]
        self.count = {}.fromkeys(range(len(self.values)),0)

    def __len__(self):
        return len(self,values)

    def __getitem__(self,key):
        self.count[key] += 1
        return self.values[key]

c1 = CountList(1,3,5,7,9)
>>> c2 = CountList(2,4,6,8,10)
>>> c1[1]
3
>>> c1.count
{0: 0, 1: 1, 2: 0, 3: 0, 4: 0}


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-19 11:17:59 | 显示全部楼层
2020/2/19
定制列表

*容器定制的协议

*如果你希望定制的容器是不可变的话,你只需要定义__len__()和__getitem__()方法

*如果希望定制的容器是可变的话,除了要定义__len__()和__getitem__()方法外,还要定义__setitem__()和__getitem__()方法

练习:定制一个不可变的列表
class CountList:
    def __init__(self,*args):
        self.values = [x for x in args]
        self.count = {}.fromkeys(range(len(self.values)),0)

    def __len__(self):
        return len(self,values)

    def __getitem__(self,key):
        self.count[key] += 1
        return self.values[key]
c1 = CountList(1,3,5,7,9)
>>> c2 = CountList(2,4,6,8,10)
>>> c1[1]
3
>>> c1.count
{0: 0, 1: 1, 2: 0, 3: 0, 4: 0}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-19 11:32:49 | 显示全部楼层
2020/2/19
迭代器

两个内置函数iter(),next()

斐波那锲函数
class Fibs:
    def __init__(self,n=10):
        self.a = 0
        self.b = 1
        self.n = n
    def __iter__(self):
        return self
    def __next__(self):
        self.a,self.b = self.b,self.a + self.b
        if self.a>self.n:
            raise StopIteration
        return self.a

fibs = Fibs()
for each in fibs:
        print(each)
#可控
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-19 14:39:11 | 显示全部楼层
狐狸1 发表于 2020-2-19 09:41
2020/2/19
描述符(property)的原理

很棒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 10:15:04 | 显示全部楼层
2020/2/20

今天出研究生初试成绩,好紧张
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 11:53:25 | 显示全部楼层
学不下去,淦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-21 10:20:39 | 显示全部楼层
加油~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-21 22:08:08 | 显示全部楼层
自闭了但还要接着学python。
2020/2/21

生成器
*所谓的协同程序就是可以运行的独立函数调用,函数可以暂停或者挂起,并在需要的时候从程序离开的地方继续或者重新开始。

例子:

def mygen():
    print("生成器被执行")
    yield 1   #执行到这里就会自动停止运行
    yield 2

myg=mygen()
>>> next(myg)
生成器被执行
1
>>> next(myg)
2
>>> next(myg)
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    next(myg)
StopIteration

#next()是执行生成器的一个方法

for i in mygen():
        print(i)

#结果       
生成器被执行
1
2

**以前天的斐波那契为例
def libs():
    a = 0
    b = 1
    while True:
        a, b=b,a+b
        yield a
for each in libs():
        if each > 100 :
                break
        print(each,end=" ")

#结果顺利

1 1 2 3 5 8 13 21 34 55 89

#逻辑:for each in libs():调用libs()函数,while True:永远为真,a赋值为b(1),b赋值为a+b(1),挂起a=1,则each 取值为1,小于100,循环继续,这次循环是绕过初始值,直接在yield后继续,也即是在while循环继续。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-21 22:26:44 | 显示全部楼层
狐狸1 发表于 2020-2-21 22:08
自闭了但还要接着学python。
2020/2/21

ohhhhhhhhhhh,感觉很厉害的样子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-21 22:55:06 | 显示全部楼层
2020/2/21

if  __name__ == '__main__'
    text()  #text()在上面额外定义
*如果name 是等于模块名,呐整个if加text是作为模块导入,可专门用来测试。

**搜索路径,用append()

***包(package)
1,创建一个文件夹,用于存放相关的模块,文件夹的名字即包的名字。
2,在文件夹中创建一个__init__.py的模块文件,内容可以为空(规定)
3,将相关的模块放入文件夹
导入方法:import 包名.模块名
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-22 11:34:33 | 显示全部楼层
2020/2/22
爬虫1

URL的一般格式为(带方括号的为可选项):
protocol://hostname[:port]/path/[;parameters][?query]#fragment

URL由三部分:
*第一部分是协议:http,https,ftp,file,ed2k
*第二部分是存放资源的服务器的域名系统或IP地址(有时候要包含端口号,各种传输协议都有默认的端口号,如http的默认端口为80)
*第三部分是资源的具体地址,如目录或文件名等

试着爬了b站,很后悔
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-22 12:08:24 | 显示全部楼层
2020/2/22
爬虫2 看不太懂,就获取了一下一张猫片,后面明天再看一遍。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-22 17:21:42 | 显示全部楼层
成功pa
import urllib.request
import urllib.parse
import json

content = input('请输入要输入的内容:')
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
data = {}
data['type'] = 'AUTO'
data['i'] = content
data['doctype'] = 'json'
data['version'] = '2.1'
data['keyfrom'] = 'fanyi.web'
data['ue'] = 'utf-8'
data['typoResult'] = 'true'


data = urllib.parse.urlencode(data).encode('utf-8')

response = urllib.request.urlopen(url,data)
html = response.read().decode('utf-8')


target = json.loads(html)

print('翻译结果:%s' % (target['translateResult'][0][0]['tgt']))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-22 17:22:36 | 显示全部楼层
成功:
代码:
import urllib.request
import urllib.parse
import json

content = input('请输入要输入的内容:')
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
data = {}
data['type'] = 'AUTO'
data['i'] = content
data['doctype'] = 'json'
data['version'] = '2.1'
data['keyfrom'] = 'fanyi.web'
data['ue'] = 'utf-8'
data['typoResult'] = 'true'


data = urllib.parse.urlencode(data).encode('utf-8')

response = urllib.request.urlopen(url,data)
html = response.read().decode('utf-8')


target = json.loads(html)

print('翻译结果:%s' % (target['translateResult'][0][0]['tgt']))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-22 17:28:50 | 显示全部楼层
import urllib.request
import urllib.parse
import json

content = input('请输入要输入的内容:')
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
data = {}
data['type'] = 'AUTO'
data['i'] = content
data['doctype'] = 'json'
data['version'] = '2.1'
data['keyfrom'] = 'fanyi.web'
data['ue'] = 'utf-8'
data['typoResult'] = 'true'


data = urllib.parse.urlencode(data).encode('utf-8')

response = urllib.request.urlopen(url,data)
html = response.read().decode('utf-8')


target = json.loads(html)

print('翻译结果:%s' % (target['translateResult'][0][0]['tgt']))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-21 23:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表