Python学习笔记-05

41.可变参数

计算a2+b2+c2+...

def calc(*nums):

    sum = 0

    for i in nums:

        sum = sum + i * i

    return sum

print(calc(2, 4, 6))

print(calc(2, 4, 6, 8, 10))

输出:

56

220

在传的参数前面加一个*就代表可变参数,在调用时可以传入任意多个参数,传入的多个参数是作为一个元组进行传入的。

如果已经有一个元组或者列表,如何传入可变参数的方法中?

def calc(*nums):

    sum = 0

    for i in nums:

        sum = sum + i * i

    return sum

a = [0, 1, 2, 4]

print(calc(*a))
输出:

21

只需要在元组或者列表的前面加一个*,就可以把这个元组或者列表的所有元素作为一个可变参数传入方法

42.关键字参数

关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict

用法是在参数前面加上**

def person(name, age, **kw):

    print('name:', name, 'age:', age, 'other:', kw)

person("Allen", 32)

person("Bob", 22, hobby="game")

person("Charles", 56, hobby="music", Status="married")

输出:

name: Allen age: 32 other: {}

name: Bob age: 22 other: {'hobby': 'game'}

name: Charles age: 56 other: {'hobby': 'music', 'Status': 'married'}

同时也可以把一个字典通过在字典前加上**传入关键字参数

def person(name, age, **kw):

    print('name:', name, 'age:', age, 'other:', kw)

d = {"hobby": "reading", "Status": "single", "city":"Nanjing"}
person("Davis", 12, **d)

输出:

name: Davis age: 12 other: {'hobby': 'reading', 'Status': 'single', 'city': 'Nanjing'}

43.命名关键字参数

命名关键字参数可以对传入的参数进行一定的限制

def person(name, age, *, city, job):

    print(name, age, city, job)

在进行调用时,命名关键字参数需要使用参数名对应值的方式进行调用

person('Jack', 24, city='Beijing', job='Engineer')

输出:Jack 24 Beijing Engineer

44.组合参数

用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数

def f1(a, b, c=0, *args, **kw):

    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)

def f2(a, b, c=0, *, d, **kw):

    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)

虽然可以组合多达5种参数,但不要同时使用太多的组合,否则函数接口的可理解性很差。

45.递归函数

在一个函数的内部调用自身函数

例如计算阶乘

def factorial(n):

    if n == 1:

       return 1

    return n * factorial(n - 1)

print(factorial(10))

输出:

3628800

递归函数可以用循环实现,使用递归函数能够使得逻辑更加清晰

递归函数容易出现栈溢出的问题,解决方法是采用尾递归优化(以后用到再学习)

46.切片操作

切片操作是,对一个列表或者元组进行一定范围或者规律的截取

生成一个0-19数字的列表

Demo = list(range(20))

语法是:List[起始点:终点:步长]

其中起始点,终点,步长都可以省略,省略起始点代表从下标0的地方开始,省略终点代表从起始点取到结束,省略步长代表步长为1,起始点和终点都可以为负数,-1为最后一个元素

取前五个元素

print(Demo[0:5])

取前三个元素,省略起始点

print(Demo[:3])

取后五个元素

print(Demo[15:20])

取后五个元素,省略终点

print(Demo[15:])

取后五个元素,用负数形式

print(Demo[-5:])

取前十个元素的偶数,步长为2

print(Demo[0:10:2])

取五的倍数,省略起始点和终点,步长为5

print(Demo[::5])

输出:

[0, 1, 2, 3, 4]

[0, 1, 2]

[15, 16, 17, 18, 19]

[15, 16, 17, 18, 19]

[15, 16, 17, 18, 19]

[0, 2, 4, 6, 8]

[0, 5, 10, 15]

47.迭代

遍历可迭代的对象中的每个元素,常用的是列表、元组和字符串(词典这类没有下标的也可以迭代,但是迭代出的结果,顺序可能不一样)

Demo = list(range(20))

for i in Demo:

    print(i, end=" ")

输出:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 

可以在for循环里引用两个变量,第一个变量可以代表索引编号,在enumerate中,start=1表示索引从1开始

Demo = list(range(5))
for i, element in enumerate(Demo, start=1):
print(i, element)

输出:

1 0

2 1

3 2

4 3

5 4



48.判断一个对象是否可以被迭代,可以通过collections模块的Iterable

from collections import Iterable
print(isinstance("Tony", Iterable))

输出:

True

isinstance是用来判断变量类型的

用法是

isinstance(变量, 类型)

如果符合就返回True,如果不符合就返回False

49.enumerate方法

enumerate讲一个可以迭代的对象中的所有元素组合为一个索引序列,同时列出数据和数据下标,常用在for循环中

用法:

enumerate(可迭代对象,[start=0])

start=0代表生成索引序列的下标是从0开始,返回的是一个可枚举的对象

fruits = ["apple", "banana", "orange"]
for i, value in enumerate(fruits, start=1):
print(i, value)

输出:

1 apple

2 banana

3 orange

50.列表生成式

列表生成式,是可以通过一定条件,生成列表的方式,可以简化代码,(与循环语句生成一个效果,但是代码量少了不少)

利用循环语句生成1-10平方的列表

demo = []

for i in range(1, 11):

    demo.append(i * i)

print(demo)

输出:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

列表生成式

print([i * i for i in range(1, 11)])

输出:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

如果再加上判断,就更加明显了,生成1-10中偶数的平方

demo = []

for i in range(1, 11):

    if i % 2 == 0:

        demo.append(i * i)

print(demo)

输出:

[4, 16, 36, 64, 100]

列表生成式:

print([i * i for i in range(1, 11) if i % 2 == 0])

输出:

[4, 16, 36, 64, 100]

猜你喜欢

转载自www.cnblogs.com/tangnightmare/p/10334774.html