三年前大一第一次接触的编程语言就是Python,达到的巅峰水平就是写一个很多函数扔在一起的文件,后来学编译原理的时候用python写实验报告,然后基本上就是在用C++和Javascript了。借这个考研复试的机会重学一次,希望能查漏补缺,能深入一些到工程层面更好,来不及就算了。
2022.2.25
看到关于列表的删除添加排序等等,方法很多,从使用方法来看分成两种,一种是面向对象形式的,一种是内置函数形式的。python自动识别定义的变量的类型,定义即声明。lst.sort()这种方法就是调用成员函数了吧,当然有权改动lst的值。sorted(lst)这种调用内置函数的用法,不是引用传递,返回值只是临时变量也说的过去。其实我感觉没必要用内置函数,python的列表那么强大,肯定封装的很好吧,敲一个lst.联想出来的函数一看就懂,后面还有参数。len()内置函数来确定列表项的个数很方便,不过不是还有个类的__len()__方法么,不知道为什么不用这个。继续学习观察。小提示,类似list.reverse()这种调用的返回值都是None,如果要获得结果需要先复制列表再对其调用成员函数,至于复制应该如何复制下面会提到。
列表解析,把生成列表的语句塞进列表,非常优雅。写的时候逐步添加东西进去:1、一个列表[]。2、通项公式如2i。3、循环如for i in range(1,3)。最后形式是[2i for i in range(1,3)]。列表切片[起始位置:结束位置:步长]。遵循基本原则有前闭后开(起始位置包括,结束位置不包括)、序号原则(从0开始从前往后递增标记,或者-1开始从后往前递减标记)。所谓列表切片复制都是引用复制,因为列表里存放的是对象的引用,所以什么东西都能塞到列表里。严谨的C++是绝不会容忍此行为的!总之我感觉深拷贝yyds,但是要import copy,没有对象嵌套的时候浅拷贝够用,或者说本来就希望内层指向的是同一个对象。用切片其实就算是浅拷贝。直接赋值就是给对象起别名,over。
元组只要记住是不可修改的(顶层不变性),但是可以整体重新赋值。字典主要记住遍历方式,dict.items(),dict.keys(),dict.values()。总之不知道怎么写就先看成员函数,列出来的东西type一下看看什么类型,然后list转一下,然后直接就遍历呗。python传参是传的对象的引用,知道这个就好办了,显然直接传列表什么的就类似C++的引用,可以修改;但是要记住,任何操作一定要在传入参数的对象上进行,而不是在函数内部做一个复制该对象的复制,那就中计了。如果本意就是希望传复制,那么在传参的时候就手动传一个复制,比如lst[:]一个浅复制。嵌套的可以传深复制。这里体现的python不同于C++的理念,万物皆对象,有点意思,第一遍的时候完全不明白,现在有一点理解了,还需要继续学习。
2.26
函数的传参,带一个*号可以把后续的参数输入都放到元组,带两个*号可以把后续参数放到字典,参数输入当然要有键值对如jian=3。关于定义和传参的合法性检查都做的很好,因此要强调的只有一点,那就是位置一一对应,必须有且仅有一种能成立的匹配参数的方式,否则就会报错。我们很容易举出一些反例,如:
def ttest(*a,**b):
print(a)
print(b)
return
传参只有类似
ttest(1,2,3,key1=1,key2=2)
这样的才能唯一匹配参数。如果出现以下情况:
ttest(key1=1,key2=2,1,2,3) ttest(1,2,key1=1,3,key2=2)
都是没办法找到一种能把参数放到对应元组或字典的办法的。还有一种是有歧义如:
def ttest(*a,*b): return
报错多个带一*参数不能定义在一起。
关于导入模块函数的做法:一个.py文件就是一个模块,模块名就是文件名。下面展示一些导入模块函数的写法。假设有一个test.py文件,即test模块,里面有一个ttest函数。
import test test.ttest() import test as ts #模块起别名 ts.ttest() from test import ttest ttest() from test import ttest as tst #函数起别名 tst() from test import * #test模块里的全部函数都能用,但是可能会因为重名而覆盖,谨慎使用 ttest()
python读写文件:
with open('1.txt') as file:#with自动管理文件开闭
content = file.read() #文件对象file包含了一般用的到的所有读文件操作
content = file.readlines() #按行读入,写入列表
with open('1.txt','w') as file: #w是覆盖写模式,a是追加写模式
file.write("write something.")



