这是确认上岸的第一篇 ブログ, 还没正式收到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__
- 单下划线: _
1 前置下划线:_var
这个没啥可说的, _var, 就是告诉别人这是类里面的私有变量, 别瞎用,别人用了也没啥法子。。。
2 后置单下划线:var_
这个, 着实让我想大喊声妙啊, 就是你想起的变量名是py内置的关键字时, 可以加个_, 都是py程序员们自己的约定。
如 class_, def_
3 前置下划线:__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 # 会报错
4 前后双下滑线: __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) } , 这不是废话么")
我刚感觉这个很强大啊。 具体的其他操作我一会看看官网, 在写一篇。。。。