读 深入理解python特性

本文深入探讨了Python编程中的关键概念,包括断言方法、上下文管理器的使用、下划线与双下划线的规则及字符串格式化技巧。通过实例解析,帮助读者理解并掌握这些核心编程要素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 这是确认上岸的第一篇 ブログ, 还没正式收到offer, 还不敢太得意,终于可以稍微放心下, 提升下自己了,,

关于这本书,JD白条,嫖了60块的券, 感谢京东,,

 

一 断言方法,assert

因为1 不等于2, 会抛出AssertionError: fuck it的异常

def test():

    assert 1 == 2, "fuck it"

    print(123)

test()

下面就是书上一个很好的例子, 价格异常会抛出异常。

def apply_discount(product, discount):

    price = int((product['price']) * (1.0 - discount))

    assert 0 <= price <= product['price']

    return price

 

但是断言需要注意, 元组断言永不言败,手动滑稽

也会抛出异常, 说它永远为真。

def test():

    assert (1 == 2, "fuck it")

    print(123)

test()





123

E:/demo/atest.py:2: SyntaxWarning: assertion is always true, perhaps remove parentheses?

  assert (1 == 2, "fuck it")

二 上下文管理器和with

下面是with, 经常出现的场景,

with open("xx.text", 'w') as f:

    f.write('xxxxxx')

上面的代码,相当于下面的,  索引with, 相当于rty, finally 

f = open('xx.txt', 'w')

try:

    f.write("xxxx")

finally:

    f.close()

自定义上下文问管理器:

1. 通过类, 实现__enter__, 和 __exit__两个个方法, 关于这两个,我打算在开篇blog搞一下。https://blog.youkuaiyun.com/DeskyAki/article/details/102758210

 

class ManageFiles(object):

    def __init__(self, name):

        self.name = name

    def __enter__(self):

        self.file = open(self.name, 'w')

        return self.file

    def __exit__(self, exc_type, exc_val, exc_tb):

        if self.file:

            self.file.close()

with ManageFiles("xx.txt") as f:

    f.write("xxxx")

 

2 通过装饰器

from contextlib import contextmanager

@contextmanager

def managed_file(name):
    try:
        f = open(name, 'w')

        yield f

    finally:

        f.close()

with managed_file('xx.txt') as f:

    f.write("xxx")

下面是一个书上的一个巧妙demo

class Indenter(object):

    def __init__(self):

        self.level = 0

    def __enter__(self):

        self.level += 1

        return self

    def __exit__(self, exc_type, exc_val, exc_tb):

        self.level -= 1

    def print(self, text):

        print("    " * self.level + text)




with Indenter() as indent:

    indent.print("hi!")

    with indent:

        indent.print('hello')

        with indent:

            indent.print('こにちは')

    indent.print('hey')


"""

    hi!

        hello

            こにちは

    hey

"""

三 下划线, 双下划线和其他

  • 前置下划线:_var
  • 后置单下划线:var_
  • 前置下划线:__var
  • 前后双下滑线: __var__
  • 单下划线: _

前置下划线:_var

这个没啥可说的, _var, 就是告诉别人这是类里面的私有变量, 别瞎用,别人用了也没啥法子。。。

后置单下划线:var_

这个, 着实让我想大喊声妙啊,  就是你想起的变量名是py内置的关键字时, 可以加个_, 都是py程序员们自己的约定。

如 class_,  def_ 

前置下划线:__var, 是为了防止子类覆盖父类的属性

这个稍微复杂些, 其实早就知道, 在这在BB下

 

下面的例子, 或报错 说t2  没有__baz 属性。

class Test(object):

    def __init__(self):

        self.foo = 11

        self._bar = 23

        self.__baz = 42


class ExtendedTest(Test):

    def __init__(self):

        super().__init__()

        self.foo = "overridden"

        self._bar = "overridden"

        self.__baz = 'overridden'


t2 = ExtendedTest()

t2.foo

t2._bar

t2.__baz

这是因为, 当定义__baz这个属性, py内部给它改了名字 改成了_Test__baz, 就是防止子类所以覆盖父类的属性,

但是硬是要改的话,这样t2._Test__baz  就可以了。

 

 

下面说的时双前下划线的属性和方法x,在类的内部是可以随意调用的, 但是在外部不能调用。

 

class Test(object):

    def __init__(self):

        self.__mangled = 'hello'

    def get_mangled(self):

        print(self.__mangled)

    def __method(self):

        return 42

    def call_it(self):

        return self.__method()

Test().get_mangled()

Test().call_it()

Test().__mangled    # 会报错

Test()._method      # 会报错

前后双下滑线: __var__

py内值的方法, 叫什么魔法方法,,,和用户关系不大

 

5 单下划 _

这个例子说打印5个ojbk, 跟每次循环的次数没关系,但是我就是想用i能怎样?

for _ in range(5):

    print("ojbk")

元组解包

就是解决了变量命名的烦恼, 但是打印_, 永远是12, 就是最后一个_

car = ('red', 'auto', 12, 9999)

color, _, _, mileage = car

print(color)        # red

print(mileage)      # 9999

print(_)            # 12

print(_)            # 12

 

四 字符串格式化

1. 旧式的字符串格式化

没啥可说的, 我是觉得比format方便

first_name = "desky"

last_name = "aki"

print("hello %s - %s" % (first_name, last_name))

2 format

这个也没啥可说的, 虽然很简单,但是稍微复杂一些的, 以用就忘  手动捂脸

我在单独开篇blog

3 字符串字面值插值

          这个式python3.6 才加的功能,隐隐约约似乎有些影响

name = "aki"

print(f"hello {name}")



a = 5

b = 10

print(f"5 + 10 = {a+5} 不是 {2 * (a+b) } , 这不是废话么")

 

我刚感觉这个很强大啊。 具体的其他操作我一会看看官网, 在写一篇。。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值