南大慕课《用Python玩转数据》-02Python面面观
本章主要涉及选择结构、循环结构和自定义函数等内容。
2.1 条件
1. if 语句
2. else语句
3. elif语句
4. 条件嵌套
注意下面代码的语法
k = raw_input('input the index of shape:')
if k == '1':
print 'circle'
elif k == '2':
print 'oval'
elif k == '3':
sd1 = int(raw_input('the first side:'))
sd2 = int(raw_input('the second side:'))
if sd1 == sd2:
print "the square's area is:%d" %(sd1*sd2)
else:
print "the rectangle's area is:%d" %(sd1*sd2)
print 'rectangle'
elif k == '4':
print 'triangle'
else:
print 'you input the invalid number'
2.2 range和xrange
可以产生一组有规律的数字,常用在循环结构中。
1. 语法
range(start,end,step=1) #不包括end
range(start,end) #默认步长为1,不包括end
range(end) #默认从0开始
xrange语法与range是一样的。
2. range与xrange的异同
.
xrange 更节省内存,因为它的返回值是一种生成器(一种特殊的迭代器),更适合处理大数据量。
3. python3.0中的变化
在python 3当中已没有xrange函数了,python 2 中 xrange函数,在python3 中是range(),python 2中的range函数,在python 3 中需要显式调用 ,如 list(range(10))
4. 代码示例
print range(3,12,2) #输出: [3, 5, 7, 9, 11]
print range(3,12) #输出: [3, 4, 5, 6, 7, 8, 9, 10, 11]
print range(6) #输出: [0, 1, 2, 3, 4, 5]
print xrange(6) #输出: xrange(6)
print list(xrange(6)) #输出: [0, 1, 2, 3, 4, 5]
for i in xrange(3,11,2):
print "xrange %d" %i
for i1 in range(3,11,2):
print "range %d" %i1
上述的输出结果为
xrange 3
xrange 5
xrange 7
xrange 9
range 3
range 5
range 7
range 9
2.3 循环
1. while循环
sumA = 0
j = 1
while j < 5:
print "j:%d" %j
sumA += j
j +=1
print "sumA:%d" %sumA
输出结果为
j:1
j:2
j:3
j:4
sumA:10
2. for 循环
语法
for iter_var in iterable_object:
suite_to_repeat
iterable_object(可迭代的对象),包含了如下
String
List
Tuple
Dictionary
File
s = 'python'
for c in s:
print c
p
y
t
h
o
n
列表解析 print [i+1 for i in range(10) if i %2 ==0] #输出 [1, 3, 5, 7, 9]
生成器表达式 print (a+1 for a in range(10) if a %2 ==0) #输出 <generator object <genexpr> at 0x020EF3C8>
一般数据量比较大的时候,用生成器表达式,数据量不太大的时候,用列表解析。
2.4 循环中的break,continue和else
1. break
质数(prime number)又称素数,有无限个。除了1和它本身以外不再有其他的除数整除。根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积,最小的质数是2。
# 输出2-100之间的素数
from math import sqrt
j = 2
while j <= 100:
i = 2
k = sqrt(j)
while(i <= k ):
if j%i == 0:break
i = i + 1
if(i > k):
print j,
j += 1
from math import sqrt
for i in range(2,101):
k = int(sqrt(i)) #获取其平方根
flag = 1 #每个循环判断前,先默认每个数都是素数,0是合数,1是素数
for m in range(2,k+1):
if ( i%m == 0): #发现有能被整除的数
flag = 0 #设置其为合数
break #一旦发现有可以被除的数,则终止判断
if (flag == 1): #如果该数是素数
print i, #添加了一个逗号后,打印的数如下,不换行
输出:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
为什么是平方根:如果一个数不是素数是合数, 那么一定可以由两个自然数相乘得到, 其中一个大于或等于它的平方根,一个小于或等于它的平方根。并且成对出现。
问题:
i = 1
while(i % 3):
print i,
if (i >= 10):
break
i += 1
A.1 2 4 5 7 8 #只列出了这个容易错误的选项,注意当循环到3的时候,while内的结果就是false了,会跳出循环,不会继续循环 后面的4-10
D.1 2 #正确答案
2. continue语句
- 在while 和 for 循环中,continue语句的作用是
- 停止当前循环,重新进入新的循环(break是终止整个循环)
- while循环是判断循环条件是否满足
- for 循环是判断迭代是否结束
#输出结果为 从3到101的奇数,因为遇到偶数会被整除,通过continue会跳过循环
sumA = 0
i = 1
while i <= 100:
sumA += i
i += 1
if (i % 2 == 0):
continue
print "i=%d,sum=%d" %(i,sumA)
3. 循环中的else语句
- 如果循环代码从break处终止,则跳出循环
- 正常结束循环的话,则执行else中的代码
# case1: 这个程序满足if条件,则break跳出循环,不执行else语句
for i in range(1,10):
if i > 5:
print("程序终止,执行到了第 %d 次" %i) #如果满足if条件,则break跳出循环
break
else:
print ("程序被执行到了第 %d 次" %i) #正常结束时被调用
# case2: 这个程序不会满足if内的条件,会正常结束for循环,然后走到else中
for i in range(1,10):
if i > 100:
print("程序终止,执行到了第 %d 次" %i) #如果满足if条件,则break跳出循环
break
else:
print ("程序被执行到了第 %d 次" %i) #正常结束时被调用
case1输出结果为: 程序终止,执行到了第 6 次
case2输出结果为: 程序被执行到了第 9 次
2.5 自定义函数
1. 自定义函数的创建
def addMe2Me(x): #def funcation_name([arguments])
'apply operation + to argument' #optional documentation string
return (x + x) #function_suite
print addMe2Me(3.7) #调用自定义函数
' ' 中成为DocString,是一个函数的注释,如果要看一个函数的DocString,要使用:
print fn.__doc__
2.默认参数(1)
函数可以有个默认值,在函数定义中,默认参数以赋值语句的形式提供
def f(x = True):
"whether x is a correct word or not"
if x:
print 'x is a correct word'
print 'OK'
print f() #
print f(False)#
x is a correct word
OK
OK
3.默认参数(2)
传递多个参数,只有一个参数有默认值。python中规定,默认参数放在参数列表的最后。
def f(x, y=True):
print f(68) # x为68,y为默认值true
print f(68,False)
- 关键字参数
def f(x,y)
f(68,False) #这个叫做位置参数,即参数的传入顺序与函数定义中的相同
f(y = False,x = 68) #允许改变参数列表中的参数顺序,但是必须要使用参数名区分。这种叫做关键字参数
f(y = False,68) #☓这种写法是错误的,一旦使用了关键字参数,就全部要带上参数名
4.传递函数
把函数名当中一个普通的参数一样,传递给另一个函数
def addMe2Me(x):
return 2*x
def self(f,y):
print f(y)
self(addMe2Me,2.2) #output : 4.4
lamda函数
※以后再详细了解※
2.6 递归
※略,以后再补※
2.7 变量作用域
global_str = 'hello'
def foo():
local_str = 'world'
return global_str + local_str
print foo()
def f(x):
global a #a是一个全局变量,没有这个global语句强调全局变量的话,程序会报错
print a
a = 5
print a + x
a = 3
f(8)
print a
3 #这是输出结果
13
5
测验部分
- 如下面的代码,输出结果是11,lamda函数/函数参数 都有体现
def test(f, a, b):
print(f(a, b))
test((lambda x,y: x ** 3 + y), 2, 3)
- 找前5个默尼森数。P是素数且M也是素数,并且满足等式M=2P-1,则称M为默尼森数。例如,P=5,M=2P-1=31,5和31都是素数,因此31是默尼森数。
from math import sqrt
# python 2.7
# 判断一个数是否是素数的函数
def isPrime(i):
k = int(sqrt(i)) #获取其平方根
flag = 1 #每个循环判断前,先默认每个数都是素数,0是合数,1是素数
for m in range(2,k+1):
if (i%m == 0):
flag = 0 #设置为合数
return 0 #返回不是素数
break #一旦发现有可以被除的数,终止判断
if (flag == 1):
#print"%d is a prime" %i
return 1 #返回是素数
#找出NumMax 个默尼森数
def searchMonisen(NumMax):
num = 0 # 用来给找到的默尼森数 计数
x = 2 # 素数2开始寻找
while (num < NumMax):
if ( isPrime(x) == 1):
m = 2**x-1 #用来寻找 默尼森数
if ( isPrime(m) == 1):
print "%d is a monisen" %m
num += 1
x += 1
#调用函数,找出前5个默尼森数
searchMonisen(5)
TODO
- 生成器/迭代器 的概念
- 列表解析 / 生成器表达式
- 递归
- lamda函数
- is 和 == 运算符的差别