【不定期更新Python学习过程中遇到的奇奇怪怪小问题 / tips】
1 同时从控制台(键盘)输入多个变量值:
a,b,c = raw_input('请输入a b c的值,以空格分隔:\n').split( )
print 'a,b,c分别为:',a,b,c
>>>请输入a b c的值,以空格分隔:
>>>11 22 33 #从键盘输入,最后按回车
>>>a,b,c分别为:11 22 33
2 得到逆序字符串(翻转字符串):print word[ : : -1]
3 优先级:not > and > or
所以 True or False and False 结果是True !
4 python2.7中,
-12 / 10 = -2
-12 % 10 = 8
而在C++中,
-12 / 10 = -1
-12 % 10 = -2
amazing and WHY ??
5 在空列表上使用for循环,循环体不会被执行
l = []
for x in l:
print 'this will never be printed.'
6 list的方法,比如.append() .extend() .sort()都是没有返回值的(返回None)。所以不能直接print,
会得到None。
l = ['a','b','c']
print l.append('d')
>>
None
正确方法如下:
l = ['a','b','c']
l.append('d')
print l
>>
['a','b','c','d']
7 关于map函数:
1)
print map(int,'1234')
>>[1,2,3,4]
print int('1234')
>>1234
WHY?
2)map函数在python2.7和3.6中的一点不同:3.6版本需要加上 list( ) 函数
'''Py 3.6'''
def fun(s):
return s.capitalize()
names = ['james','SAM','doBBi']
b = list(map(fun,names))
print(b)
>>['James','Sam','Dobbi']
'''Py2.7,直接写'''
b = map(fun,names)
8 关于递归函数是否会有返回值:
第一种情况,当n不为0时,执行digui(n)函数,是没有返回值的(虽然递归过程中调用了digui(0) )
第二种情况下,在递归调用digui(n-1)的前面多加了return,则n>0的时候,执行digui(n)也是有返回值(‘这是返回值’)的
9 写一个函数,接受另一个函数对象作为形参:(要注意的是形参“f”在函数call_fun里的表达方式,有无括号等)
10 字符串方法strip():
可见,word.strip('123')方法,将删除原字符串左右两端全部的‘1’,‘2’和‘3’字符,而不是只删除‘123’样式的子串。
11 在空列表上使用for循环,则循环体从不会被执行:
for i in []:
print 'This will not be printed.'
不过,这种情况会被执行喔:
for i in [[]]:
print 'This will happen !'
12 复制list a,对复制后的list b进行操作,同时不改变原list a中的元素:
方法1:
import copy
a = [1,2,3,4]
b = copy.deepcopy(a)
方法2:
a = [0,1,2,3]
b = a[:]
'''这之后,对列表b进行更改,并不改变原列表a 【注意那个“:”号!】'''
【这两种方法有什么不同,各自优劣,尚不清楚】
tip:下述做法,b 与 a将指向同一个列表地址,更改b即是更改a
a = [0,1,2,3]
b = a
13 不同的写方法得到不一样的结果!!
a = [1,2,3,4,5]
b = [1,2,3,4,5]
c = [1,2,3,4,5]
b[3:] = ['x'*4] #写法1
c[3:] = ['x']*4 #写法2
print 'a:',a
print 'b:',b
print 'c:',c
>>>
a: [1, 2, 3, 4, 5]
b: [1, 2, 3, 'xxxx'] #结果1
c: [1, 2, 3, 'x', 'x', 'x', 'x'] #结果2
14 得到倒序range列表:(注意listB从5开始,而listA不包括5)
'''Python 3.6'''
listA = list(range(5))
>>[0,1,2,3,4]
listB = list(range(5,-1,-1))
>>[5,4,3,2,1,0]
15 把整数的各位存到列表:
integer = 1234
b = map(int,str(integer))
print b
>>
[1,2,3,4]
把整数各位作为字符存到列表:
integer = 1234
l = list(str(integer))
print l
>>
['1', '2', '3', '4']
16 a is b ?
a = 'school'
b = 'school'
a is b
>>True #a和b都指向同一个对象
a = [1,2,3]
b = [1,2,3] #或者 b =a[:]
a is b
>>False
出现这种区别是因为:字符串是“不可变”的,而列表是“可变”的。
tip:a is b 和 a == b 是不同的含义
17 return还能这样写...
'''输出两个数中较大的数'''
def big(a,b):
return a if a>b else b
18 Python 中,让数字和字符比较大小,是会输出结果的(虽然逻辑上没有道理),比如
100 < 'a'
>> True
19 尽量不要使用如下方式创建列表:
t = [[0]*3]*4 #创建一个“4*3”的值为零的二维向量
会由于浅拷贝的原因导致一系列问题
20 如果列表有序,使用二分查找比 word in list 方法快很多
21 两个for i in range(n)循环嵌套,不会互相影响 i 的取值
t = ['a','b','c']
for i in range(4):
print(i)
for i in t:
print('in',i)
>>
0
in a
in b
in c
1
in a
in b
in c
2
in a
in b
in c
22 在需要作为模块被导入的.py文件内写:
if __name__ == '__main__':
ans = function(xxx)
....
则if内包含的语句不会被执行(避免运行时显示出不需要的内容)
23 编写函数时,如果在某处需要程序抛出异常,则写语句:
raise ValueError
raise 语句也接收一个可选的参数用来详细描述错误:
raise ValueError, 'Oh there is an xxx error'
24 字典的“键(key)”必须是“不可变类型”的数据,例如str , int, tuple 等类型;
而字典的“值(value)”可以是可变类型,如列表list,甚至是字典dict
字典是通过散列表(哈希表,hashtable)的方式实现的,所以其“键”必须是可散列的(hashable)。
散列是一个函数,接收(任意类型)的值并返回一个整数。字典使用这些被称为散列值的整数来保存和查找键值对。
——《Think Python》
25 关于函数内是否可以更改外部的全局变量:(情况较复杂,暂时还没完全搞清。不过,以后在需要修改全局变量的时候,在函数内部尽量写上一句“global xxx”,则在函数内部对xxx的修改就一定是修改的全局变量xxx了)
26 python3中,input()函数默认输入的是字符串类型哦