Python基础中容易被忽视的细节

字符串

python中打印字符串用单引号和双引号的效果完全一样,但有时需要混合使用

print('abc')
print("abc")

print("let's go")
print('"hello"')
# print('let's go')  # 解释器报错
print('let\'s go')  # 需要转义

常规字符串可以跨行,加上反斜杠,实际上效果还是在同一行

print("Hello, \
    world")
print(1 + 2 + \
      3)

转义

print("\"hello\"")

print(repr("123 \n 45"))  # '123 \n 45' 不进行转义输出原石字符串
print(r'let\'s go')  # let\'s go

# print(r"Anime \")  # 不能以单个反斜杠结尾,这样就把其中一个双引号转义了,格式出错

print(r'C:\lib\bin\\')  # C:\lib\bin\\,若想以单个反斜杠结尾,如下方所示
print(r'C:\lib\bin''\\')  # 以反斜杠结尾 C:\lib\bin\

lower和strip方法很有用,录入用户输入时不区分大小写/无视左右两侧多打的空格

lst = ['luffy', 'sanji', 'zoro']
name = 'SanJi'
if name.lower() in lst:
    print('good')

name2 = ' zoro '
if name2.strip() in lst:
    print('good')

print("----------------------------")
s = "*** ab * c * d !!! **"  # 可以指定删除
print(s.strip(' *!'))  # ab * c * d

将字符串格式设置功能用于字典(很方便)

s = 'my name is {name}, i am {age} years old'
data = {"name":"Luffy", "age":"22"}
result = s.format_map(data)
"""format_map方法通过映射来提供所需信息,也就是提供key获取value"""
print(result)  # my name is Luffy, i am 22 years old

序列

对于字符串,可直接对其进行索引操作,不用先赋值

print('Hello'[1])  # e

切片

lst = [1, 2, 3, 4, 5, 6, 7, 8 ,9, 10]
print(lst[:])  # 全部元素
print(lst[3:-1])  # [4, 5, 6, 7, 8, 9]

"""当步长为负数时,第一个索引必须比第二个索引大"""
print(lst[5:1:-2])  # 步长为负数时,从右向左提取 [6, 4]
print(lst[1:5:-2])  # 这种就为空[]

将列表的长度初始化为5

lst = [None] * 5
print(lst)  # [None, None, None, None, None]

给切片赋值

lst = list('python')
lst[2:] = list('123456')
print(lst)  # ['p', 'y', '1', '2', '3', '4', '5', '6']

lst[2:] = list('aa')
print(lst)  # ['p', 'y', 'a', 'a']
# 不论新值的长度是否小于/等于/大于旧值,都会被替换

使用切片插入新元素/删除元素

lst = [1, 2, 3, 4, 5]
lst[2:2] = ['a','b','c']
print(lst)  # [1, 2, 'a', 'b', 'c', 3, 4, 5]

lst[1:4] = []
print(lst)  # [1, 'c', 3, 4, 5]

定义单个元组元素需要加逗号

t1 = (4)
print(type(t1))  # <class 'int'>
t2 = (4,)
print(type(t2))  # <class 'tuple'>

r1 = 3 * (4+2)
r2 = 3 * (4+2,)
print(f"r1 = {r1}  , r2 = {r2}")  # r1 = 18  , r2 = (6, 6, 6)

fromkeys创建字典

d = dict.fromkeys(['name', 'age'])
print(d)  # {'name': None, 'age': None},默认是none

d2 = dict.fromkeys(['name', 'age'], '空')
print(d2)  # {'name': '空', 'age': '空'}

update方法使用一个字典来更新另一个字典

d = {"name":"路飞",
     "title":"小镇青年",
     "age":22}

d2 = {"title":"海贼王"}

d.update(d2)
print(d)  # {'name': '路飞', 'title': '海贼王', 'age': 22}

序列解包

x, y, z = 1, 2, 3
print(x, y, z)

# 交换
x, y = y, x
print(x, y)  # 2 1

"""序列包含的元素个数必须与等号左边列出的目标个数相同"""
# a, b = 1, 2, 3  # 出错

a, b, *rest = 1, 2, 3, 4, 5  # 用*收集多余的值
print(a, b, rest)  # 1 2 [3, 4, 5]

a, *rest, b = 1, 2, 3, 4, 5  # 也可以放在其他位置
print(a, rest, b)  # 1 [2, 3, 4] 5

条件&循环&其他

条件表达式

name = input("输入名字:")
s = "海贼王" if name.lower() == "luffy" else "山贼王"
print(s)

 is和==不一样,is比较的是地址,==比较的是值

x = y = [1, 2, 3]
z = [1, 2, 3]
print(x == y)  # True
print(x == z)  # True
print(x is y)  # True
print(x is z)  # False

断言assert,必须满足特定条件,程序才会接着运行

age = 20
assert 0 < age < 100, 'age error'
age = -5
assert 0 < age < 100, 'age error'

while判断条件的注意事项

想这样输入一个空格也能运行,有瑕疵

name = ''
while not name:
    name = input("please enter name:")
print(f"name is {name}")

 改进,加上strip()

name = ''
while not name.strip():
    name = input("please enter name:")
print(f"name is {name}")

 

 更方便的迭代字典

d = {"船长":"路飞", "航海士":"娜美", "船医":"乔巴"}
for k, v in d.items():  # items()是取字典的键和值
    print(k, v)

enumerate迭代时获取索引

s = ['海贼王', 'EVA', '春物']
for i in enumerate(s):
    print(i)

循环后的else语句,循环结束后执行

先来看正常break后的

for i in range(1, 10):
    if i == 5:
        print(f"find {i}")
        break
else:  # 注意这里的else并不是和if匹配的,是单独的
    print("not find")

print("over")

 

 再来看没触发break的

for i in range(1, 10):
    if i == 'a':
        print(f"find {i}")
        break
else:
    print("not find")

print("over")

 exec将字符串作为代码执行

exec("print('打游戏')")
from math import sqrt

d = {}
exec('sqrt = 5', d)
print(sqrt(4))  # 2
print(d['sqrt'])  # 5

eval计算用字符串表示的表达式的值

result = eval(input("输入想要计算的表达式:"))
print(result)

抽象

变量可以指向方法(闭包就是这个道理)

class onePiece:
    def say(self):
        print("我要当海贼王")

op = onePiece()
op.say()

test = op.say
test()

 多重继承

class cal:
    def cal(self, ex):
        self.value = eval(ex)

class talker():
    def talk(self):
        print('say:', self.value)

class talkCal(cal, talker):
    pass

tk = talkCal()
tk.cal('1 + 2 * 3')
tk.talk()

 设置对象属性setattr()

setattr(tk, 'name', 'Luffy')
print(tk.name)  # Luffy

可以只用一段代码捕获所有异常,except后面不用指定任何异常,不建议这么做

try:
    print(1/0)
except:
    print("出错了")

异常

 捕获异常后面可以跟上else,若没触发异常则执行else( finally是不管有没有发生异常都触发)

try:
    print('ok')
except:
    print("出错了")
else:
    print("没问题")
finally:
    print('结束')

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值