1. 由123 and 456结果引发的思考:
These are the Boolean operations, ordered by ascending priority:
Operation | Result | Notes |
---|---|---|
x or y | if x is false, then y, else x | (1) |
x and y | if x is false, then x, else y | (2) |
not x | if x is false, then True, else False | (3) |
Notes:
- This is a short-circuit operator, so it only evaluates the second argument if the first one is False.
- This is a short-circuit operator, so it only evaluates the second argument if the first one is True.
- not has a lower priority than non-Boolean operators, so not a == b is interpreted as not (a == b), and a == not b is a syntax error.
参考自
python文档
说的白话一点——
and 的规则是
(1)如果全部为真,则返回最后一个值。
(2)如果其中有假,则返回第一个假值。
or 的规则是
(1)不管有多少个真值,都返回遇到的第一个真值。
(2)如果全部为假,则返回最后一个假值。
(1)如果全部为真,则返回最后一个值。
(2)如果其中有假,则返回第一个假值。
or 的规则是
(1)不管有多少个真值,都返回遇到的第一个真值。
(2)如果全部为假,则返回最后一个假值。
2. 2**2**3 与 (2**2)**3的运算结果是否一致?
答:
并不会一致,实际上这跟一些数学上的基础有一定关系
2**2**3,按照大多数人的思考方式会以为:算出2的2次方之后再算这个结果的三次方,而实际上运算应该是: 2^(2^3) = 2^8
3. 关于\n的
先来看两段程序:
s = "hello \n world"
print s
input = raw_input()
print input
输入“hello \n world”
两端程序的输出结果并不一样
对于用户输入的\n,Python是不会打印newline的,然而,对于一个String里面包含\n,Python是会打印newline的。
4. if条件的逻辑
来看一段代码:
grade = 97
if grade < 60:
print 'E'
elif grade >= 60:
print 'D'
elif grade >= 70:
print 'C'
elif grade >= 80:
print 'B'
elif grade >= 90:
print 'A'
作者的本意是筛选正确的分数顺序,无奈使用if-elif 语句时顺序排列确有问题,正确的顺序应该是本程序从下至上依次淘汰。
5. 下列求100以内所有奇数之和的程序是否正确?
sum = 0
i = 1
while sum < 100:
if i % 2 != 0:
sum += i
i += 2
print sum
实际上要解决上面的问题,如果时间比较充裕的话,可以采取自己独立写一个程序然后对比的方式。
这道题很明显的陷阱就在于,初始化条件、循环条件、循环条件改变语句 并不统一。
对于循环,记住一个技巧,就是三个条件:循环条件初始、循环条件、循环条件改变 的变量不能混乱!
6. 关于Python变量之间“赋值”的问题
实际的运行如下代码:
l = [1,2,3,4]
l1 = l
l = [2,2,3,4]
print 'l = ',l
print 'l1 = ',l1
n = 1
n1 = n
n = 0
print 'n = ',n
print 'n1 = ',n1
l = [1,2,3,4]
l1 = l
l[0] = 2
print 'l = ',l
print 'l1 = ',l1
明确两点:
其一:变量即为指针
其二:赋值操作会将指针指向新的内存地址
那么很明显,当进行 l1 = l 或者 n1 = n 的操作的时候,实际上是将地址进行“赋值”。
第一段代码之所以和第三段代码结果不一样也很容易理解了:第一段代码的 l 在最后进行了新的 list 的地址的绑定,所以 l1 与 l 的地址并不一样,里面存储的值也不会一样;而第三段代码 l 是在原值基础上进行改变,没有进行新的地址的绑定,而在第二步的时候 l 就将其地址赋给了 l1 ,所以说,这两个变量共享的是同一个地址。
n的那段代码也相当好理解了,n之后进行了新的值的绑定,所以n , n1 两个值是不一样的(实际上n是基础变量,并不会进行地址的赋值,而是直接将值赋给变量)。
关于这个问题一定要明确到底对变量做了什么操作,赋值还是修改
那么再来看两段代码:
lst = [1, 2, 3]
def f(lst):
lst = [4, 5, 6]
f(lst)
print lst
def f2(lst):
lst[0] = 0
f2(lst)
print lst
同样的是使用了 “ = ” 这个操作,得到的效果是不一样的,仍然跟上面说的有关系:
第一个是赋值操作:赋值之后,指针会指向新的内存地址,也就是是说 f(lst) 函数里面的 lst 指向了一个新的地址,但是,函数 f 却并没有return lst 的值并且对 全局变量 (f 中的 lst 实际上只是f 函数的一个local variable ) lst 进行重新赋值操作,仅仅只在函数内部对 lst 进行了修改,与如下代码的原理是一致的:
a = 0
def f(a):
a = 2
f(a)
print a
而第二段代码并没有赋予新的值,也就是说地址指针一直都是指向原lst 的地址,是对原来的 lst 上做改变,所以不需要返回值就可以改变原 lst 值
7. 明确到底得到的是什么值
list = [1, 2, 3]
print list.append(4)
print list
两次 print 的结果是不一样的。
注意:第一次 print 的结果是list 的append函数
第二次则是 list 本身
其实 append 函数并没有return任何值,所以打印出来的是None,而不是所预想的 list append了一个4。
8. String 伪装运算
def area_triangle(base, height):
return 0.5 * base * height
b = '5'
h = '2+2'
print 'Area of triangle with base', b, 'and height', h, 'is', area_triangle(b, h)
在这里会有一个报错:TypeError: can't multiply sequence by non-int of type 'float'
sequence 实际上指的就是 String, String并不是数字,不能和整数进行运算。
同样的,来看看
print '3+2'
结果会是什么呢?很容易惯性的将结果计算出来,认为是5,但是这却是一个String,并不会进行计算,直接打印出引号里面的text
9. 路径有中文字符/python文件中带有中文字符
如果没有任何编码格式,直接运行会报错:SyntaxError: Non-ASCII character, but no encoding declared
这时候参考
报错提供的文档,加上:
#!/usr/bin/python
# -*- coding: utf-8 -*-
10. 安装一些库。
使用pip来安装
# using pip
pip install virtualenvwrapper-win
# using easy_install
easy_install virtualenvwrapper-win
# from source
git clone git://github.com/davidmarble/virtualenvwrapper-win.git
cd virtualenvwrapper-win
python setup.py install
使用pip 常常会失败,因为网络连接可能根本找不到这样的distribution:not matching xxx????????????