美文网首页
python 基础语法2:简单函数、切片、迭代、生成列表

python 基础语法2:简单函数、切片、迭代、生成列表

作者: fables008 | 来源:发表于2019-11-19 17:52 被阅读0次

计算机的发展遵循摩尔定律


静态语言编译过程
脚本语言解释过程

程序编写原则:IPO

  1. 分析问题
  2. 划分边界
  3. 设计算法
    4.编写程序
    5.调试测试
    6.升级维护
    两种编程方式:交互式(适合语法练习)和文件式(主要方式)

函数

函数的定义

#由def关键字、函数名字以及扩号、括号里的参数与冒号组成

def square_of_sum(L): # square_of_sum是函数名,也可以命名成别的
    sum = 0
    for x in L:
        sum = sum + x * x
    return sum
print square_of_sum([1, 2, 3, 4, 5])
print square_of_sum([-5, 0, 5, 15, 25])

# 函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。

函数的返回多值和递归

import math  # math包提供了多种函数,我们先用import引用它:
def quadratic_equation(a, b, c):
    x1=(-b+math.sqrt(b*b-4*a*c))/(2*a) #写的时候也要加上math.funtion name
    x2=(-b-math.sqrt(b*b-4*a*c))/(2*a)
    return x1,x2   #Python的函数返回多值其实就是返回一个tuple,但写起来更方便。
print quadratic_equation(2, 3, 0)
print quadratic_equation(1, -6, 5)
  • 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
  • 使用递归函数需要注意防止栈溢出。
# 第一个例子 fact(n) = n! = 1 * 2 * 3 * ... * (n-1) * n = (n-1)! * n = fact(n-1) * n
def fact(n): 
    if n==1:
        return 1
    return n * fact(n - 1)

# 第二个例子
def move(n, a, b, c):  #定义move函数
   if n ==1:                # 如果只有1个圆盘
       print a, '-->', c  #圆盘路径直接从A到C就可以了
       return              #结束
   move(n-1, a, c, b)  #如果不是一个圆盘,那首先应该将n-1个圆盘从A移动到B
   print a, '-->', c      #将A柱上最后一个圆盘从A移动到C就
   move(n-1, b, a, c) #将B上的n-1个圆盘移动到C
move(4, 'A', 'B', 'C') 

python之定义默认默认参数和可变参数

  • 函数的默认参数的作用是简化调用
  • 由于函数的参数按从左到右的顺序匹配,所以默认参数只能定义在必需参数的后面
  • 可变参数的名字前面有个 * 号,我们可以传入0个、1个或多个参数给可变参数
>>> int('123') # 默认十进制
123
>>> int('123', 8) # 八进制下的123等于1*64+2*8+3
83

# 第二个例子
def greet(name='world'):
    print 'Hello, ' + name + '.' 
greet()#没有传入,为默认
greet('Bart') #传入输出其他

# 第三个例子
# OK:
def fn1(a, b=1, c=2):
    pass 
# Error:
def fn2(a=1, b): #默认参数a=1,应该在后面
    pass 

#实操:编写接受可变参数的平均函数
def average(*args):
    sum = 0.0
    if len(args) == 0:
        return sum
    for x in args:
        sum = sum + x
    return sum / len(args)

对list、tuple以及字符串切片

  • 取前n个数: L[0:n]第一个索引为0可以省略,写成L[:n],可以得出这些结果里不包括L(n);
  • L[:]表示从头到尾
  • 取第a到b-1个索引的数:L[a:b],结果不包括L[b],列表里有b-a个数
  • 从第a到b-1个索引的数,每隔n取一次:L[a:b-1:n],a=0是可省略,从头到尾每隔n取一次:L(::n)
  • 同时支持倒序切片,但也是从左到右的序列。记住倒数第一个元素的索引是-1。
  • tips:切片包含起始索引,不包含结束索引。
  • 字符串切片也是同样的原理,字符串的初始索引也是0
# 实际操作1
L = range(1, 101) #从0开始101停止,步长为1
print L[:10] #取前10个数
print L[2::3] # 3的倍数
print L[4:50:5] #50以内包括50的5的倍数
print L[-10:] #取出后10个数
print L[-46::5] #取出后10个5的倍数,确定起始数为L[-1-5*9] 

#练习2:首字母大写,而其他字幕不受影响
def firstCharUpper(s):
    return s[0].upper()+s[1:]
print firstCharUpper('hello') # 输出为Hello

迭代

  • 在python中,用for...in来迭代,从而取出有序和无序集合中的每一个元素
  • Python 的 for循环不仅可以用在list或tuple上,还可以作用在其他任何可迭代对象上。
  • 迭代永远是取出元素本身,而非元素的索引
  • enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。语法为enumerate(sequence, [start=0])
  • zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。语法为 zip([iterable, ...])
  • dictionary的values() 方法实际上把一个 dict 转换成了包含 value 的list, 但是 itervalues() 方法不会转换,它会在迭代过程中依次从 dict 中取出 value,所以 itervalues() 方法比 values() 方法节省了生成 list 所需的内存。
  • items() 方法把dict对象转换成了包含tuple的list,我们对这个list进行迭代,可以同时获得key和value。但iteritems() 不把dict转换成list,而是在迭代过程中不断给出 tuple,所以, iteritems() 不占用额外的内存。
  • for 循环可作用的迭代对象远不止 list,tuple,str,unicode,dict等,任何可迭代对象都可以作用于for循环,而内部如何迭代我们通常并不用关心。
  • 如果一个对象说自己可迭代,那我们就直接用 for 循环去迭代它,可见,迭代是一种抽象的数据操作,它不对迭代对象内部的数据有任何要求。
练习1:用for循环迭代数列 1-100 并打印出7的倍数。
for i in range(1,101):
    if i%7==0:
        print i

练习2 :给定一个dict,计算所有同学的平均分。
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59, 'Paul': 74 }
sum = 0.0
for v in d.itervalues():
    sum+=v
print sum/len(d)

练习3:请根据dict,打印出 name : score,最后再打印出平均分 average : score。
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59, 'Paul': 74 }
sum = 0.0
for k, v in d.iteritems():
    sum = sum + v
    print k,":",v
print 'average', ':', sum/len(d)

生成列表

写列表生成式时,把要生成的元素 x * x 放到前面,后面跟 for 循环,就可以把list创建出来
列表生成式的 for 循环后面还可以加上 if 判断
for循环可以嵌套,因此,在列表生成式中,也可以用多层 for 循环来生成列表。

练习1:
print [x*(x+1) for x in range(1,100,2)]
练习题2:
def capital_letter(L):
  return [x.upper() for x in L if isinstance(x,str)]  #变成大写的,且排除掉不是字符串的
print capital_letter(['hello','world',123])
练习3:
对于字符串 'ABC' 和 '123',可以使用两层循环,生成全排列:
L = []
for m in 'ABC':
    for n in '123':
        L.append(m + n)
练习4:找到从左到右倒过来一样的三位数
L=[]
for a in range(1,10):
    for b in range(0,10):
        for c in range(0,10):
            if a==c:
                L.append(100*a+10*b+c)
print (L)

需要注意区分,形参和实参;全局变量和局部变量

相关文章

网友评论

      本文标题:python 基础语法2:简单函数、切片、迭代、生成列表

      本文链接:https://www.haomeiwen.com/subject/vxcnmqtx.html