南大慕课《用Python玩转数据》-02Python面面观

南大慕课《用Python玩转数据》-02Python面面观_第1张图片

本章主要涉及选择结构、循环结构和自定义函数等内容。

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的异同

.


南大慕课《用Python玩转数据》-02Python面面观_第2张图片

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) #输出 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

  1. 生成器/迭代器 的概念
  2. 列表解析 / 生成器表达式
  3. 递归
  4. lamda函数
  5. is 和 == 运算符的差别

你可能感兴趣的:(南大慕课《用Python玩转数据》-02Python面面观)