人生苦短我用Python(二)——函数、切片、迭代、列表生成式

本文深入探讨Python编程中的关键概念,包括函数的调用与编写,如何处理函数的返回值,特别是递归函数的应用。接着介绍了切片操作在列表和字符串中的应用。此外,文章还详细讲解了Python的迭代机制,包括对不同数据结构的迭代方式,以及如何通过enumerate()获取索引和元素。最后,重点讨论了列表生成式的使用,包括简单的生成列表、条件过滤和多层表达式等应用场景。
摘要由CSDN通过智能技术生成

一.函数

1.调用函数

  调用函数需要知道函数的名称和参数。如果传入的参数类型和个数不匹配,就会报TypeError错误。

  如调用绝对值函数:abs(-12)

2.编写函数

  定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号,然后在缩进块中编写函数体,函数的返回值用return语句返回。如果没有return语句,函数执行完毕也会返回结果,只是返回结果为None。return None可以简写为return。

def square_of_sum(L):
    return sum(x*x for x in L)

print square_of_sum([1, 2, 3, 4, 5])
print square_of_sum([-5, 0, 5, 15, 25])

3.返回多个值的函数

  如有如下的一个move方法,返回了两个值。

import math
def move(x, y, step, angle):
    nx = x + step * math.cos(angle)
    ny = y - step * math.sin(angle)
    return nx, ny

  获得返回值:

x, y = move(100, 100, 60, math.pi / 6)
print x, y

  可以看到打印出了两个值,但实际上Python的函数返回多值其实就是返回一个tuple。

4.递归函数

  使用递归函数需要注意防止栈溢出。

  如经典的汉诺塔问题,我们可以将其想象成三部分:

(1)将A上除了最大的那个圆盘外的其他圆盘挪到B上;

(2)将A上最大的圆盘挪到C上;

(3)将B上的所有圆盘挪到C上。

  代码实现如下:

def move(n, a, b, c):
    if (n == 1):
        print a, '-->', c
        return
    # 将a上除最大圆盘外的所有圆盘挪到c上
    move(n - 1, a, c, b)
    # 将a上最大的圆盘挪到c上
    move(1, a, b, c)
    # 将b上的圆盘全部挪到c上
    move(n - 1, b, a, c)

move(4, 'a', 'b', 'c')

5.定义默认参数的函数

  函数默认参数的作用是为了简化调用。

  定义函数时可以有默认的参数,默认参数不传,则使用默认值,传默认参数则使用额外传入的参数覆盖默认参数值。

  由于函数的参数按照从左到右的顺序匹配,所以默认参数只能定义在必须参数的后面。

def greet(str1='world'):
    print 'Hello,' + str1 + '.'

greet()
greet('Bart')

6.定义可变参数的函数

  如果想让一个函数接受任意个参数,就可以定义一个可变参数。可变参数的名字前面有一个*号,可以传入0个、1个、多个参数给可变参数。python会把传入的一组参数组装成一个tuple传递给可变参数。

def average(*args):
    if len(args)==0:
        return 0.0
    else:
        return (sum(args)*1.0)/len(args)
print average()
print average(1, 2)
print average(1, 2, 2, 3, 4)

二.切片

1.对list进行切片

取一个list的部分元素,python提供了切片(slice)操作符。

L = ['Adam', 'Lisa', 'Bart', 'Paul']
# 取前三个元素
print L[0:3]
# 如果第一个索引是0,可以省略
print L[0:3]
# 只用一个: 表示从头到尾
print L[:]
# 切片操作还可以指定第三个参数,表示每N个参数取1个
print L[1:3:2]

2.倒序切片

  Python支持L[-1]取倒数第一个元素,那么它同样支持倒数切片。

L = range(1, 101)
# 最后10个数
print L[-10:]
# 最后10个5的倍数
print L[-46::5]

3.对字符串切片

 字符串也可以用切片操作,操作结果仍为字符串。

 如:print 'ABCDEFG'[:3]

def firstCharUpper(s):
    # 将字符串的首字母利用切片操作变为大写
    return s[:1].upper()+s[1:len(s)]

print firstCharUpper('hello')
print firstCharUpper('sunday')
print firstCharUpper('september')

三.迭代

1.迭代()

  通过for循环遍历集合,这种遍历我们称为迭代。

  迭代是通过for...in来完成的。python的for循环可以作用在任何可迭代对象上。

(1)集合是指包含一组元素的数据结构,我们已经介绍的包括:

  •  有序集合:list,tuple,str和unicode;
  •  无序集合:set
  •  无序集合并且具有 key-value 对:dict
# 使用for循环迭代数列 1-100,并打印出7的倍数
for i in range(1, 100):
    if i % 7 == 0:
        print i

2.索引迭代

  python中迭代永远是取出元素本身,而非元素的索引。、

  想在for循环中拿到索引,要使用enumerate()函数,使用enumerate()函数,我们可以在for循环中同时绑定索引index和元素name。函数把每个元素变成了一个tuple。

# 使用range()和zip()函数打印出名次-名字
L = ['Adam', 'Lisa', 'Bart', 'Paul']
for index, name in zip(range(1,len(L)+1),L):
    print index, '-', name

3.迭代dict的value

   dict对象有一个values()方法,这个方法吧dict转换成一个包含所有value的list,这样我们迭代的就是dict的每一个value。

   dict对象还有一个itervalues()方法。

   values()方法实际上把一个dict转换成了包含value的list,但是itervalues()不会转换,它会在迭代过程中依次取出value,所以itervalues()方法比value()方法节省了生成list需要的内存。

d = {'Adam': 95, 'Lisa': 85, 'Bart': 59, 'Paul': 74}

sum = 0.0
for v in d.values():
    sum += v
print sum * 1.0 / len(d)

4.迭代dict的key和value

  dict有一个items()方法,把dict对象转化成了包含tuple的list,对这个list进行迭代,可以同时获得key和value。

  items() 也有一个对应的 iteritems(),iteritems() 不把dict转换成list,而是在迭代过程中不断给出 tuple,所以, iteritems() 不占用额外的内存。  

d = {'Adam': 95, 'Lisa': 85, 'Bart': 59, 'Paul': 74}

sum = 0.0
for k, v in d.items():
    sum = sum + v
    print k + ':' + str(v)
print 'average', ':', sum * 1.0 / len(d)

四.列表生成式

1.生成列表

  列表生成式则可以用一行语句代替循环生成list。

print [x * (x + 1) for x in range(1, 100, 2)]

2.复杂表达式

  使用for循环的迭代不仅可以迭代普通的list,还可以迭代dict。

d = {'Adam': 95, 'Lisa': 85, 'Bart': 59}


def generate_tr(name, score):
    if score < 60:
        return '<tr><td>%s</td><td style="color:red">%s</td></tr>' % (name, score)
    return '<tr><td>%s</td><td>%s</td></tr>' % (name, score)


tds = [generate_tr(name, ) for name, score in d.iteritems()]
print '<table border="1">'
print '<tr><th>Name</th><th>Score</th><tr>'
print '\n'.join(tds)
print '</table>'

3.条件过滤

列表生成式的for循环后面还可以加上if判断。

# -*- coding: UTF-8 -*-

# 将list中所有字符元素变成大写后返回,非字符串元素将被忽略
# isinstance(x, str) 判断变量 x 是否是字符串;
def toUppers(L):
    return [x.upper() for x in L if isinstance(x,str)]

print toUppers(['Hello', 'world', 101])

4.多层表达式

  for循环可以嵌套,可以使用多层for循环来生成列表。

L = []
for a in range(1, 10):
    for b in range(10):
        for c in range(10):
            if a == c:
                L.append(100 * a + 10 * b + c)
print L

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值