前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ARTS第二周

ARTS第二周

作者头像
zx钟
发布于 2019-07-18 13:53:53
发布于 2019-07-18 13:53:53
41500
代码可运行
举报
文章被收录于专栏:测试游记测试游记
运行总次数:0
代码可运行

Algorithm主要是为了编程训练和学习。每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard)。进行编程训练,如果不训练你看再多的算法书,你依然不会做算法题,看完书后,你需要训练。关于做Leetcode的的优势,你可以看一下我在coolshell上的文章 Leetcode 编程训练 - 酷 壳 - CoolShell。 Review:主要是为了学习英文,如果你的英文不行,你基本上无缘技术高手。所以,需要你阅读并点评至少一篇英文技术文章,我个人最喜欢去的地方是http://Medium.com 以及各个公司的技术blog,如Netflix的。 Tip:主要是为了总结和归纳你在是常工作中所遇到的知识点。学习至少一个技术技巧。你在工作中遇到的问题,踩过的坑,学习的点滴知识。 Share:主要是为了建立你的影响力,能够输出价值观。分享一篇有观点和思考的技术文章。

Algorithm

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: 123
输出: 321

示例 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: -123
输出: -321

示例 3:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: 120
输出: 21

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import math
class Solution:
    def reverse(self, x: int) -> int:
        if x > 0:
            i = int(math.log10(x))+1
            flag = 1
        elif x < 0:
            flag = -1
            i = int(math.log10(-x))+1
            x = -x
        elif x == 0:
            return 0
        test_dict = {}
        while i >= 0:
            test_dict[i] = x % 10
            i -= 1
            x = x // 10
        new_num = 0
        for key,value in test_dict.items():
            new_num += value * pow(10,key-1)
        if int(new_num) * flag > pow(2,31) -1 or int(new_num) * flag < -pow(2,31):
            return 0
        return int(new_num) * flag

写完我都不知道自己在干啥了,速度上还可以,但是空间占用上就不行了。

执行情况

速度分布

借鉴一下执行速度最快的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def reverse(self, x: int) -> int:
        rev = 0
        while x != 0:
            pop = x % 10 - 10 if x < 0 and x % 10 != 0 else x % 10
            x = int(x / 10)
            if rev > (2 ** 31 - 1) / 10:
                return 0
            if rev < - (2 ** 31) / 10:
                return 0
            rev = rev * 10 + pop
        return rev

分析一下pop

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pop = x % 10 - 10 if x < 0 and x % 10 != 0 else x % 10
# 等价于
if x < 0 and x % 10 != 0: # 负数和10的倍数
   pop = x % 10 -10
else
    pop = x % 10

Review

一直觉得python的元类很神奇,所以本次阅读一篇关于元类的介绍

What are metaclasses in Python?

https://stackoverflow.com/questions/100003/what-are-metaclasses-in-python

A metaclass is the class of a class.

类定义了实例对象的行为方式,元类定义了类的行为方式。类就是元类的实例对象。

A metaclass is most commonly used as a class-factory. When you create an object by calling the class, Python creates a new class (when it executes the 'class' statement) by calling the metaclass. Python通过元类声明一个新的类。

声明class的过程中,Python会像执行一个代码块一样执行它,它的结果是一个保存属性的命名空间(字典)。

This object (the class) is itself capable of creating objects (the instances), and this is why it's a class.

普通方式创建一个类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> class MyShinyClass(object):
...       pass

使用type创建一个类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> MyShinyClass = type('MyShinyClass', (), {}) # returns a class object
>>> print(MyShinyClass)
<class '__main__.MyShinyClass'>
>>> print(MyShinyClass()) # create an instance with the class
<__main__.MyShinyClass object at 0x8997cec>

type接收字典作为类属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 普通方式构造一个Foo类
>>> class Foo(object):
...       bar = True

# 通过type的方式构造Foo类
>>> Foo = type('Foo', (), {'bar':True})

type接收对象作为父类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 普通方式构造一个Foo的子类FooChild
>>>   class FooChild(Foo):
...         pass

# 通过type的方式构造一个Foo的子类FooChild
>>> FooChild = type('FooChild', (Foo,), {})
>>> print(FooChild)
<class '__main__.FooChild'>

# 查看FooChild的父类Foo的类属性bar
>>> print(FooChild.bar) # bar是上一个例子Foo中的类属性
True

type接收函数对象作为类方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 定义一个方法echo_bar
>>> def echo_bar(self):
...       print(self.bar)

# 使用type的方式构建一个包含echo_bar方法的类
>>> FooChild = type('FooChild', (Foo,), {'echo_bar': echo_bar})

# 测试
>>> hasattr(Foo, 'echo_bar')
False
>>> hasattr(FooChild, 'echo_bar')
True
>>> my_foo = FooChild()
>>> my_foo.echo_bar()
True

所以!也可以动态的通过这种方法增加类方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> def echo_bar_more(self):
...       print('yet another method')
...
>>> FooChild.echo_bar_more = echo_bar_more
>>> hasattr(FooChild, 'echo_bar_more')
True

Everything, and I mean everything, is an object in Python.

In Python2
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Foo(object):
    __metaclass__ = something...
    [...]
In Python3
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Foo(object, metaclass=something):
    pass

class Foo(object, metaclass=something, kwarg1=value1, kwarg2=value2):
    pass

把类属性都变成大写的元类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# the metaclass will automatically get passed the same argument
# that you usually pass to `type`
def upper_attr(future_class_name, future_class_parents, future_class_attr):
    """
      Return a class object, with the list of its attribute turned
      into uppercase.
    """

    # pick up any attribute that doesn't start with '__' and uppercase it
    uppercase_attr = {}
    for name, val in future_class_attr.items():
        if not name.startswith('__'):
            uppercase_attr[name.upper()] = val
        else:
            uppercase_attr[name] = val

    # let `type` do the class creation
    return type(future_class_name, future_class_parents, uppercase_attr)


__metaclass__ = upper_attr  # this will affect all classes in the module


class Foo():  # global __metaclass__ won't work with "object" though
    # but we can define __metaclass__ here instead to affect only this class
    # and this will work with "object" children
    bar = 'bip'


print(hasattr(Foo, 'bar'))
# Out: False
print(hasattr(Foo, 'BAR'))
# Out: True

f = Foo()
print(f.BAR)
# Out: 'bip'

The reason behind the complexity of the code using metaclasses is not because of metaclasses, it's because you usually use metaclasses to do twisted stuff relying on introspection, manipulating inheritance, vars such as __dict__, etc. 元类好像就这么简单,之所以复杂是由于我们用它来进行了复杂的操作

中文翻译的文档:https://www.cnblogs.com/tkqasn/p/6524879.html

Django的ORM例子

定义用户表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Person(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()

实例化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
guy = Person(name='bob', age='35')
print(guy.age)
# It won't return an IntegerField object. 
# It will return an int.
# can even take it directly from the database.

由于models.Model定义了__metaclass__

Django的源码:

https://github.com/django/django/blob/master/django/db/models/base.py#L399

class Model(metaclass=ModelBase):从类的声明处可以发现它的元类是ModelBase

找到定义ModelBase的地方可以看到:class ModelBase(type):它继承了type类。不过源码太复杂了,阅读一下阉割版的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#coding:utf-8
#一、首先来定义Field类,它负责保存数据库表的字段名和字段类型:
class Field(object):
    def __init__(self, name, column_type):
        self.name = name
        self.column_type = column_type
    def __str__(self):
        return '<%s:%s>' % (self.__class__.__name__, self.name)

class StringField(Field):
    def __init__(self, name):
        super(StringField, self).__init__(name, 'varchar(100)')

class IntegerField(Field):
    def __init__(self, name):
        super(IntegerField, self).__init__(name, 'bigint')

#二、定义元类,控制Model对象的创建
class ModelMetaclass(type):
    '''定义元类'''
    def __new__(cls, name, bases, attrs):
        if name=='Model':
            return super(ModelMetaclass,cls).__new__(cls, name, bases, attrs)
        mappings = dict()
        for k, v in attrs.iteritems():
            # 保存类属性和列的映射关系到mappings字典
            if isinstance(v, Field):
                print('Found mapping: %s==>%s' % (k, v))
                mappings[k] = v
        for k in mappings.iterkeys():
            #将类属性移除,使定义的类字段不污染User类属性,只在实例中可以访问这些key
            attrs.pop(k)
        attrs['__table__'] = name.lower() # 假设表名为类名的小写,创建类时添加一个__table__类属性
        attrs['__mappings__'] = mappings # 保存属性和列的映射关系,创建类时添加一个__mappings__类属性
        return super(ModelMetaclass,cls).__new__(cls, name, bases, attrs)

#三、编写Model基类
class Model(dict):
    __metaclass__ = ModelMetaclass

    def __init__(self, **kw):
        super(Model, self).__init__(**kw)

    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(r"'Model' object has no attribute '%s'" % key)

    def __setattr__(self, key, value):
        self[key] = value

    def save(self):
        fields = []
        params = []
        args = []
        for k, v in self.__mappings__.iteritems():
            fields.append(v.name)
            params.append('?') # 这里其实应该是args
            args.append(getattr(self, k, None))
        sql = 'insert into %s (%s) values (%s)' % (self.__table__, ','.join(fields), ','.join(params))
        print('SQL: %s' % sql)
        print('ARGS: %s' % str(args))

#最后,我们使用定义好的ORM接口,使用起来非常的简单。
class User(Model):
    # 定义类的属性到列的映射:
    id = IntegerField('id')
    name = StringField('username')
    email = StringField('email')
    password = StringField('password')

# 创建一个实例:
u = User(id=12345, name='Michael', email='test@orm.org', password='my-pwd')
# 保存到数据库:
u.save()

#输出
# Found mapping: email==><StringField:email>
# Found mapping: password==><StringField:password>
# Found mapping: id==><IntegerField:id>
# Found mapping: name==><StringField:username>
# SQL: insert into User (password,email,username,id) values (?,?,?,?)
# ARGS: ['my-pwd', 'test@orm.org', 'Michael', 12345]

Tip

最近搭建了Gitlab的CI,想进行代码质量的审核,采用的是flask8,但是使用发现.flask8文件一直无法生效,最终采用了直接菜CI流水线中写入一整行的flask8校验语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ flake8 --ignore D203 \
         --exclude .git,__pycache__,docs/source/conf.py,old,build,dist \
         --max-complexity 10

另外:Docker搭建gitlab runner的方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 拉取镜像
$ sudo docker pull gitlab/gitlab-runner:latest
# 启动容器
$ sudo docker run -d --name gitlab-runner --restart always \
  -v /srv/gitlab-runner/config:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
  gitlab/gitlab-runner:latest
# 注册Gitlab runner
$ sudo docker exec -it gitlab-runner gitlab-ci-multi-runner register
# 进入容器内部查看状态
$ sudo docker exec -it gitlab-runner /bin/bash
# 退出,但不关闭容器
Ctrl+P+Q

具体注册方法参考以下两篇文档:

  • https://idig8.com/2018/08/22/zhongjipiandockerzhici-cdchixujichenggitlab-cifuwuqi71/
  • https://idig8.com/2018/08/30/zhongjipiandockerzhici-cdchixujichengzhenshipythonxiangmudeciyanshi72/

Share

阅读了一些外文文档然后输出的:Git基础知识(七)--分支开发工作流:https://mp.weixin.qq.com/s/xcYMzdHXgFr6BUoWHAq69w 欢迎关注我的公众号:zx94_11

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试游记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入理解Python中的元类(metaclass)
在理解元类之前,你需要先掌握Python中的类。Python中类的概念借鉴于Smalltalk,这显得有些奇特。在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍然成立:
Jetpropelledsnake21
2019/02/15
4540
python 中的元类详解
在其他语言中我们都知道类和int,string等类型一样是用来生成对象的。 类就是生成对象的代码段。 在python中任然是这样,但是Python中的类还远不止如此,在python中类也是对象。只是这个对象拥有创建对象的能力。
Tim在路上
2020/08/04
7660
Python(一)对 meta class 的理解
1. 理解  class 对于 class 来说,表示一个代码块规定了实例化后的 object 的属性和方法 但是在 Python 中,class 本身也是对象。定义一个 class,就相当于在内存中实例化了一个名为 className 的对象 作为一个对象,因此具备以下能力: 赋值给一个变量 对其拷贝 作为函数参数 class Example(object): pass object1 = Example() print(object1) # prints '<__main__.Exampl
西凉风雷
2022/11/23
2980
什么是元类metaclass?
在理解元类之前,需要先掌握Python中的类,Python中类的概念与SmallTalk中类的概念相似。 在大多数语言中,类是用来描述如何创建对象的代码段,这在Python中也是成立的:
用户2936342
2018/08/27
4130
每天一道 python 面试题 - Python中的元类(metaclass) 详细版本
在理解元类之前,您需要掌握Python的类。Python从Smalltalk语言中借用了一个非常特殊的类概念。
公众号---人生代码
2020/05/02
6300
每天一道 python 面试题 - Python中的元类(metaclass) 详细版本
改变python对象规则的黑魔法metaclass
看到标题,你可能会想改变类的定义有什么用呢?什么时候才需要使用metaclass呢?
快学Python
2021/08/09
4780
Python 中的元类到底是什么?这篇恐怕是最清楚的了
在理解元类之前,您需要掌握 Python 的类。Python 从 Smalltalk 语言中借用了一个非常特殊的类概念。
BigYoung小站
2020/07/01
7580
Python教程第7章 | 元类
在了解元类之前,我们先进一步理解 Python 中的类,在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在 Python 中这一点也是一样的。
仲君Johnny
2024/01/24
1710
Python教程第7章 | 元类
python metaclass 详细说明
在理解metaclass之前,我们需要先理解Python中的class。从某种程度上来说,Python中的class的定位比较特殊。
用户5760343
2019/12/13
5670
python 面向对象技巧 元类
动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的。
葫芦
2019/04/17
3250
面向对象进阶
issubclass(sub, super)检查sub类是否是 super 类的派生类
py3study
2020/01/16
3580
面向对象进阶
10-面向对象2
isinstance()判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上 。
用户3106371
2019/03/11
1.6K0
【python进阶】详解元类及其应用2
前言 在上一篇文章【python进阶】详解元类及其应用1中,我们提到了关于元类的一些前置知识,介绍了类对象,动态创建类,使用type创建类,这一节我们将继续接着上文来讲~~~ 5.使⽤type创建带有⽅法的类 最终你会希望为你的类增加⽅法。只需要定义⼀个有着恰当签名的函数并将 其作为属性赋值就可以了。 添加实例⽅法 In [14]: def echo_bar(self):#定义了一个普通的函数 ...: print(self.bar) ...: In [15]: FooChild
Angel_Kitty
2018/05/04
6420
比Python更牛的语言有吗?看我用元类(metaclass)花式创建Python类
为了让更多的人看到本文,请各位读者动动小手,点击右上角【...】,将本文分享到朋友圈,thanks!
蒙娜丽宁
2020/11/04
8520
Python进阶——元类是怎么创建一个类的?
如果你看过比较优秀的 Python 开源框架,肯定见到过元类的身影。例如,在一个类中定义了类属性 __metaclass__,这就说明这个类使用了元类来创建。
_Kaito
2021/03/23
1K0
《做一个不背锅运维:浅谈Python的元编程》
Python元编程是指在运行时对Python代码进行操作的技术,它可以动态地生成、修改和执行代码,从而实现一些高级的编程技巧。Python的元编程包括元类、装饰器、动态属性和动态导入等技术,这些技术都可以帮助我们更好地理解和掌握Python语言的特性和机制。元编程在一些场景下非常有用,比如实现ORM框架、实现特定领域的DSL、动态修改类的行为等。掌握好Python元编程技术可以提高我们的编程能力和代码质量。
不背锅运维
2023/03/25
9200
《做一个不背锅运维:浅谈Python的元编程》
Python 元类
在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍然成立:
Devops海洋的渔夫
2019/05/31
1.7K0
编写ORM
在一个Web App中,所有数据,包括用户信息、发布的日志、评论等,都存储在数据库中。在awesome-python3-webapp中,我们选择MySQL作为数据库。
用户8442333
2021/05/25
6950
Python元类实战,动手实现数据库ORM框架
今天是Python专题的第19篇文章,我们一起来用元类实现一个简易的ORM数据库框架。
TechFlow-承志
2020/06/24
8860
python类和元类
       今天在网上看到一篇关于python语言中类和元类(metaclass)的一些讲解和简单运用,感觉对python入门的童鞋非常有帮助,分享出来,希望大家喜欢。 (一) python中的类 今天看到一篇好文,然后结合自己的情况总结一波。 这里讨论的python类,都基于python2.7x以及继承于object的新式类进行讨论。 首先在python中,所有东西都是对象。这句话非常重要要理解元类我要重新来理解一下python中的类。 class Trick(object):     pass 当python在执行带class语句的时候,会初始化一个类对象放在内存里面。例如这里会初始化一个Trick对象。 这个对象(类)自身拥有创建对象(通常我们说的实例,但是在python中还是对象)的能力。 为了方便后续理解,我们可以先尝试一下在新式类中最古老厉害的关键字type。 input: class Trick(object): pass print type('123') print type(123) print type(Trick()) output: <type 'str'> <type 'int'> <class '__main__.Trick'> 可以看到能得到我们平时使用的 str, int, 以及我们初始化的一个实例对象Trick() 但是下面的方法你可能没有见过,type同样可以用来动态创建一个类 type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值)) 这个怎么用呢,我要用这个方法创建一个类 让我们看下下面的代码 input: print type('trick', (), {}) output: <class '__main__.trick'> 同样我们可以实例化这个类对象 input: print type('trick', (), {})() output: <__main__.trick object at 0x109283450> 可以看到,这里就是一个trick的实例对象了。 同样的这个方法还可以初始化创建类的父类,同时也可以初始化类属性: input: class FlyToSky(object):     pass pw = type('Trick', (FlyToSky, ), {'laugh_at': 'hahahaha'}) print pw().laugh_at print pw.__dict__ print pw.__bases__ print pw().__class__ print pw().__class__.__class__ output: hahahaha {'__module__': '__main__', 'laugh_at': 'hahahaha', '__doc__': None} (<class '__main__.FlyToSky'>,) <class '__main__.Trick'> <type 'type'> 下面我将依次理一下上面的内容,在此之前我必须先介绍两个魔法方法: __class__这个方法用于查看对象属于是哪个生成的,这样理解在python中的所有东西都是对象,类对象也是对象。如果按照以前的思维来想的话就是类是元类的实例,而实例对象是类的实例。 __bases__这个方法用于得到一个对象的父类是谁,特别注意一下__base__返回单个父类,__bases__以tuple形式返回所有父类。 好了知道了这两个方法我来依次说一下每行什么意思。 使用type创建一个类赋值给pw type的接受的三个参数的意思分辨是(类的名称, 类是否有父类(), 类的属性字典{}) 这里初始化一个类的实例,然后尝试去获得父类的laugh_at属性值,然后得到结果hahahaha 取一个pw的也就是我们常见类的类字典数据 拿到pw的父类,结果是我们指定的 FlyToSky pw的实例pw()属于哪个类初始化的,可以看到是class Trick 我们再看class trick是谁初始化的? 就是元类type了 (二) 什么是元类以及简单运用 这一切介绍完之后我们总算可以进入正题 到底什么是元类?通俗的就是说,元类就是创建类的类。。。这样听起来是不是超级抽象? 来看看这个 Trick = MetaClass() MyObject = Trick() 上面我们已经介绍了,搞一个Trick可以直接这样 Trick = type('Trick', (), {}) 可以这样其实就是因为,Type实际上是一个元类,用他可以去创建类。什么是元类刚才说了,元类就是创建类的类。也可以说他就是一个类的创建工厂。 类上面的__metaclass__属性,相信愿意了解元类细节的盆友,
超蛋lhy
2018/08/31
1.2K0
相关推荐
深入理解Python中的元类(metaclass)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验