python的一些技巧和知识点(二)

23 篇文章 0 订阅
14 篇文章 0 订阅

        书接上文,这篇再记录10条我觉得有用的,虽然没多少人看,但我相信还是会帮助到一部分人的,哪怕是个位数也好,此外,就当作自己的记录吧。没有看过第一篇的朋友点击这里

1.正确复制一个列表

        假设有一个列表a,之后需要复制一份儿这个列表,新列表记作b,假设将b作为b的备份也好,亦或是需要同时维护两个相同内容的列表也罢。那是直接b=a吗?让我们试一逝:

a = [x for x in range(5)]
print('a: ', a)
b = a
a[0] += a[4]
print('b: ', b)

        运行上面这一小段代码,可以得到输出:

a: [0,1,2,3,4]
b: [4,1,2,3,4]

         用b=a把a赋值给b,根据上一篇里说到的,a和b都是对这个列表的引用,对a进行修改,效果也会在b表现出来,让我们再看看a和b是不是同一个东西:

print(id(a))
print(id(b))
2226674051976
2226674051976

         可以看到a和b其实指向的都是同一个东西,在内存里都是同一块地方。正确的复制方法应该是:

b = [x for x in a] 
# or
b = [] + a

        使用空列表[]+a,python解释器会新建一个新的空列表,再把a的内容放到这个空列表之后,也就实现了列表的复制。

 2.熟练使用with

        相信一开始对文件操作时大家都肯定会打开文件后忘记关闭,这在学习初期写一些比较短的代码时问题不大,当然如果你能养成open之后记得close的习惯,那就更没有问题了。但还是墙裂推荐养成使用with关键字的习惯,它能帮你关闭你忘记关闭的文件,省时又省力,写出来的代码还好看,再结合上一篇提到的try语法,更能让你无后顾之忧。例如:

try:
    with open("something.txt","r") as f:
        for each_line in f:
            print(each_line)
except OSError as reason:
	    print("something wrong " + str(reason))

        不仅仅是文件,with还能帮助我们管理其他资源,例如需要用python访问数据库时,也可以用with作为资源的管理器,换言之,可迭代的资源(文件,数据库等)都可以用with来进行管理。 

 3.python的整数和字符 

        考虑下面几句代码,猜想结果会是什么:

a = 12
b = 12
print(id(a) == id(b))
a = 12345678
b = 12345678
print(id(a) == id(b))

        是两个True?可能有了前面的经验,会有人觉得会是两个True,但是其实是True和False,究其原因,python对小整数,有一个整数池,预先对这些小整数分配了空间,当需要用到小整数时,直接返回这些空间的引用就完事儿了,(至于这个小整数范围,我忘了,欸嘿)但对于大整数,会先分配空间,再返回引用给变量,同理,对于常用的单字符如a-z,python的机制也是事先准备了“池”。知道这个可能对写代码没啥实质性的帮助,但多少对python对象的机制有多一点了解。

4.可变对象和不可变对象

        考虑一个函数,参数是一个列表和一个元组,在这个函数里对它们进行修改,试问当这个函数返回后,原列表和元组会不会被改变?

def testListTuple(tup :tuple, lis :list):
    tup[0] = 2 * tup[0]
    lis[0] = 2 * lis[0]

a_tup = tuple((1,2))
b_list = list([1,2])
print(b_list)
testListTuple(a_tup, b_list)
print(b_list)

         运行,此代码会报错,因为元组类型是不可更改类型,只能读,不能在函数里写,

TypeError: 'tuple' object does not support item assignment

        将第二行修改tup的代码注释掉,运行,可以经过函数后,b_list变量被修改了,这一点可能大多习惯C/C++函数传值类型参数的同学会比较不习惯,还是因为“一切皆为对象的思想”,此处传递给函数的列表仍然是列表的引用,就跟C++的传引用符&一样,是对变量本身直接进行修改的,python的可变对象只有字典(dictionary)和列表(list)类型,其余都是不可变,因此如果需要用一个函数操作一个列表,而不希望对这个列表本身产生影响,就需要手动复制一个列表再传递给那个函数。有时候莫名其妙的bug可能就是由这个引起的。

5.没了,但是!

      写到这发现以前做的初学笔记好像就这些了,好像确实有点短,如果再找到另外的笔记,会继续补上。希望对你有用。

        不出意外找到另外的笔记的话,三天内更新第三篇,如果对你有帮助的话,记得点个赞哦,您的支持就是对我最大的鼓励。

第三篇加量更新,欢迎各位捧场:

python编程技巧和可能注意的地方(三)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值