为了督促自己学习,特开一帖 👨‍💻

#list是[],还有一个truple是(),dict是{},set是([]),set必须要带方法名
#list不能hash,因为list是可变的,hash根据key算出value位置,不可变
#set不能hash,因为set没有value
#字符串是不可变对象,不能标赋值
#要删除基本都用pop,除了set用remove
#几个方法,append,add(只用于set),remove,pop,replace,sort,int,float,str,bool,abs,max,hex,def,import,pass,isinstance,from,return(函数执行完必须return),None,for…in…,*,list(range(x)),tumple(range()),x.items(),x.lower()
#位置参数,默认参数,不变对象,可变参数,关键字参数(**),命名关键字参数
#%d是int,%f是float,%s是string,%x是十六进制整数(一般用不到)
#yield保存的是算法,要输出结果需要每次调用,或者使用for循环不断输出。

#求解ax²+bx+c=0
import math
def quadratic(a,b,c):
:cat2:delta=b**2-4ac
:cat2:x1=(-b+math.sqrt(delta))/2/a
:cat2:x2=(-b-math.sqrt(delta))/2/a
:cat2:return x1,x2
:cat2:print(a,b,c)

#把list中的大写str变成小写,并跳过非str
‘’‘L=[‘A’,‘B’,‘c’,18,‘d’,‘E’,37]
for l in L:
:cat2: if isinstance(l,str):
:cat2::cat2: print(l.lower())
:cat2: else:
:cat2::cat2: print(l)’’’
#我没想到把l中各个str、int组装到一个list中的办法,因为提示错误:int不可迭代。int的确是不可迭代的,可是我也没想迭代int,可能是因为在for…in的迭代方法中所以报错了。我想也许可以用def方法,然后把各个int、str等return出来,再把return出来的东西给装到list里去。。。。。。试了一下,发现结果是一样的。

#把list中的大写str变成小写,删除非str,删除list
L=[‘A’,‘B’,‘c’,18,‘d’,‘E’,37]
l=[s.lower() for s in L if isinstance(s,str)]
print(l)

晚上一直在修复论坛,恢复了80端口,修复了头像显示问题,代价为弃用域名,虽然这个域名只花了6块钱。另外把discourse英文论坛的头像动图给抄过来了,改动了论坛的一些设置,现在能发视频了。

用python生成器来生成一个杨辉三角该怎么做呢?


一开始想从每一行找规律,推断当前行下一个元素的数值,发现不太可行。其实规律就是n_m=(n-1)_ (m-1)+(n-1)_ (m),但是我怎么知道n-1行的数值都是什么呢?可能还是要一行一行来迭代,迭代出上一行后,再算出这一行的数值,再算出下一行。每一行都要yield。:man_technologist:

唉,还是看了别人的答案,发现自己基本功太差了,逻辑是懂的,只是python中的一些方法没有理解透。我知道规律是n_m=(n-1)_ (m-1)+(n-1)_ (m),但是不知道怎么把n_m和n_(m+1)、n_(m+2)…等组成一个list,其实只要加一个[ ]就好了,这个是之前学过的,我没有完全掌握。所以当前行是L的话,那下一行就是next_L=[1]+[L(x)+L(x+1) for x in range(len(L)-1)]+[1]。要循环起来的话就是L=[1]+[L(x)+L(x+1) for x in range(len(L)-1)]+[1]。除了不知道怎么组成list,我也不知道要使用len(L)这个方法。我是明白肯定跟L的元素数量有关,但是却没有想到去使用、怎么去使用,实际上就是没有掌握len()的用法。下次可以先找规律,把可能会使用上的方法写成代码,然后放到里面,想想是不是要用到,做一个排序,应该就能简单一点。

贴上代码

杨辉三角第二种解法:

发现问题,L=[1,2,3],要指定1需要要写成L[0]不是L(0)。如果L=list,那L(0)是什么意思?

L=[x for x in range(10)] 输出的是list。
L=(x for x in range(10)) 指的是生成器,要想调出生成器中的各元素,需要for…in…。但这样调出的也是许多独立的元素,不是list。要想组成list,需要L1=[y for y in L]。可见如果要生成list,完全没有必要做一个生成器,因为代码是重复的。

全部能用for循环的都是iterable的,但只有能用next()的才是iterator。可以用iter( )的方法来获得一个iterator。[ ],( ),{ }也可以理解为iter([]),iter(()),iter({})。

在方法、函数内和方法、函数外print会得到不一样的结果。举例:
it=iter([1,2,3,4,5])
while True:
:cat2: try:
:cat2::cat2: x=next(it)
:cat2::cat2: print(x)
:cat2: except StopIteration:
:cat2::cat2: break
这个print在方法内,会不断循环,得出许多print。
再举例:
it=iter([1,2,3,4,5])
while True:
:cat2: try:
:cat2::cat2: x=next(it)
:cat2: except StopIteration:
:cat2::cat2: break
print(x)
这个print只会得到一个5,因为不断循环地next(),直到next到最后一个数字5,然后print,也只会得到5。

for n in [1,2,3,4,5]:
要怎么用n组成一个list?这个是我到现在也没掌握的。
方法一
l=[n for n in [1,2,3,4,5]]
print(l)
方法二
l=[]
for n in [1,2,3,4,5]:
:cat2: l.append(n)
print(l)


l=[]
for n in [1,2,3,4,5]:
:cat2: l.append(n)
print(l)

for n in [1,2,3,4,5]:
:cat2: l=[]
:cat2: l.append(n)
print(l)

for n in [1,2,3,4,5]:
:cat2: l=[]
:cat2: l.append(n)
:cat2: print(l)

l=[]
for n in [1,2,3,4,5]:
:cat2: l.append(n)
:cat2: print(l)
输出结果是不一样的,因为流程不同

利用 map() 函数,把用户输入的不规范的英文名字,变为首字母大写、其他小写的规范名字。


如果要输出list,map()完了一定要用list(),不然只会输出方法。

编写一个 prod() 函数,可以接受一个list并利用 reduce() 求积:
image
reduce外面不用套list(),因为输出的是一个数。

利用 mapreduce 编写一个 str2float 函数,把字符串 '123.456' 转换成浮点数 123.456

filter求素数和回数,基本是看不懂,考虑要不要跳过

用filter输出回数
image
或者

假设我们用一组tuple表示学生名字和成绩:
L = [(‘Bob’,65),(‘Adam’,27),(‘Bart’,96),(‘Zzro’,93),(‘Lcsa’,59),(‘After’,72)]
请用 sorted() 对上述列表分别按名字排序:
再按成绩从高到低排序:


我本来想这样的:

发现by_name是正确的,by_score是错的。
by_score输出的是按照姓名中第二个字符来排序的,二不是根据分数。
我想可能sorted()真的比较高阶吧,感觉不像是计算机能直接读懂的代码。
后来我去问了绿和的那个董连赛,他懂python,他建议我写成这样:

这样好像就有点能懂了。第一个print是把by_name放到L中的每一个元素去执行,第二个也是把by_score放到L的每一个元素去执行,第三个也是。不过L中的元素里没有x[2],所以会报错