Python基础你并不一定master

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:

  1. This is a short-circuit operator, so it only evaluates the second argument if the first one is False.
  2. This is a short-circuit operator, so it only evaluates the second argument if the first one is True.
  3. 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)如果全部为假,则返回最后一个假值。

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????????????



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值