南大慕课《用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

  1. 生成器/迭代器 的概念
  2. 列表解析 / 生成器表达式
  3. 递归
  4. lamda函数
  5. is 和 == 运算符的差别
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容