..来自一个闲着没事作死尝试各种奇奇怪怪的方法的人
调用函数练习题:
bin()
oct()
hex()
函数变量只能是integer类型,输出为string类型。
fliter练习题:
定义函数
def 函数名(变量名):
return/print 式子```
**print和return**:在命令行中似乎没有区别,但如果是在py文件中则会有区别:直接调用函数后有无输出的区别。
尝试
def is_palindrome(n):
return n == n[::-1]```
list(filter(is_palindrome, range(1, 1000)))
显示错误TypeError: 'int' object is not subscriptable
这个错误出现在把int类型调用[索引]的时候
因此修改为
def is_palindrome(n):
return str(n) == str(n)[::-1]
函数调用中将变量代入式子 如果是判断返回True或者False
如果是计算式则返回值
因此上面的式子和下面的效果一样
def is_palindrome(n):
if str(n) == str(n)[::-1]:
return True
else:
return False
条件判断中注意比较符号等号与赋值符号的区别
另外,filter返回的是一个迭代器,虽然是非迭代器的list筛选返回的,但是你不知道会有多少个元素,因此也是一个数据流。
map练习题1:
考虑不用方法str.capitalize()返回的字符串只有它的第一个字符大写的副本
尝试1
def normalize(name):
... a = list(name)
... for i in range(len(name)):
... if i == 0:
... a[i].upper()
... else:
... a[i].lower()
... return ''.join(a)
>>> normalize('reD')
'reD'
WHY???
a = list('reD')
>>> a
['r', 'e', 'D']
>>>
>>> a[0].upper()
'R'
>>> a
['r', 'e', 'D']
a.lower() 将字符串中的大写字母变成小写字母
a.upper() 将字符串中的小写字母变成大写字母
upper 和lower 方法并不会改变string本身,而是提供一个新的内存来储存新变量。
思考:对比append()方法,是不是对于可变变量的方法都是无返回值,改变其本身,而对于不可变对象则会有个返回值,本身不变???
对于range函数用法的重新记忆
range(n)
从0开始输出,直到n-1
range(a,b)
从a开始输出,a,a+1..直到b-1
range输出的不是迭代器 也不是其他的类型,是一个特有的range类型。
故改为:
>>> def normalize(name):
... a = list(name)
... for i in range(len(name)):
... if i == 0:
... a[i] = a[i].upper()
... else:
... a[i] = a[i].lower()
... return ''.join(a)
结果:
>>> normalize('adjjfJHIAjnkj')
'AdjjfJHIAjnkj'```
Angry!!!
然后发现是return的位置写错了,因为return写在循环中,第一次循环中就被返回值。
改成:
def normalize(name):
... a = list(name)
... for i in range(len(name)):
... if i == 0:
... a[i] = a[i].upper()
... else:
... a[i] = a[i].lower()
... return ''.join(a)
...
normalize('adjjfJHIAjnkj')
'Adjjfjhiajnkj'```
GOOD!
其他尝试:
>>> def normalize(name):
... a = list(name)
... for i in range(1,len(name)):
... a[i] = a[i].lower()
... a[0] = a[0].upper()
... return ''.join(a)
...
>>> normalize('reD')
'Red'```
这时候,it occured to me that
字符串类型的索引:
a = 'rrsDaa'
a[0]
'r'
然后我就很开心的以为自己找到了一个简单的方法:
def normalize(name):
... name = name.lower()
... name[0] = name[0].upper()
... return name
结果......
normalize('reD')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in normalize
TypeError: 'str' object does not support item assignment
就出错了!!!为什么呢..字符串不支持啥???索引吗?不对啊!刚才不是都可以用索引吗!!于是我开始找错误的所在:
a
'rrsdaa'
a[0]
'r'
a[0].upper()
'R'
a[0] = a[0].upper()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
哦!我想起来了,今天一定是脑子不好使..
因为string是不可变类型相当于一个tuple,你可以把它赋值给一个新的变量但是不可以直接改变它的值除非重新赋值!
这时候就可以用一个for in 循环把改变后的name重新赋值给name这里就不尝试了..因为,并没有让代码变短变简单。