Python 学习5

xiaoxiao2021-02-28  116

思维导图

集合

集合的引入:

社团: linux兴趣小组 linuxL = [“zhang”,”wang”] python兴趣小组 pythonL = [“zhang”,”li”] 。。。。

统计所有的社团 l = []

student = “zhang” 列表: linuxL + PythonL = [“zhang”,”wang”,”zhang”,”li”]集合: {“zhang”,”wang”,”li”}

集合的定义

** 不可变的数据类型一定可哈希;hash()内置函数可以判断某个类型是否可哈希;

集合的关系测试

s1 = {1, 2, 3} s2 = {2, 3, 4} s3 = {1, 2} s4 = {5} print "s1,s2,s3的交集:", s1.intersection(s2, s3) print "s1,s2,s3的交集:", s1 & s2 & s3 print "s1,s2,s3的并集:", s1.union(s2, s3) print "s1,s2,s3的并集:", s1 | s2 | s3 print "s1-s2的差集:", s1.difference(s2) print "s1-s2的差集:", s1 - s2 print "s1-s2-s3的差集:", s1.difference(s2, s3) print "s1-s2-s3的差集:", s1 - s2 - s3 print "s2-s1的差集:", s2.difference(s1) print "s1和s2的对等差分:", s1.symmetric_difference(s2) print "s1和s2的对等差分:", s1 ^ s2 print "s2和s1的对等差分:", s2.symmetric_difference(s1) # s.isdisjoint(s2) 如果有交集,返回False;否则,返回True; print "s1和s4是否没有交集:", s1.isdisjoint(s4) print "s3是否为s1的子集:", s3.issubset(s1) print "s1是否为s3的父集:", s1.issuperset(s3)

集合的增删改查:

增加: s.add(1), s.update(s1)删除: s.remove(1), # 删除存在的元素,如果不存在,直接报错; s.discard(1) # 删除存在的元素,如果不存在,do nothing; s.pop(), # 随即删除集合元素,不加任何参数;复制: s1 = s.copy() #s和s1的id不同清空: s.clear()

冻集(frozenset)

冻住的集合,不能增删改;frozenset(set)set(frozenset)

高级特性

切片

迭代

任何可以迭代的对象都可以用for循环遍历;字典的迭代:默认是通过key进行迭代的; for i in d: print i字典的枚举:枚举只能返回返回两个值,一个是索引下标,一个是迭代的元素; d = {1:”a”,2:”b”} for i,j in enumerate(d): print i,j,d[j]怎么去判断是否可迭代 from collections import Iterable isinstance(“hello”,Iterable)

列表生成式

列表生成式,其实就是生成列表的一种方式,是python内置的;

简单的列表生成式 [ i*i for i in range(10) ] # 返回1-10平方的一个列表; [ fun(i) for i in l] # 对列表的每个元素执行某个函数操作;

for…if的嵌套 [ i*i for i in range(1,10) if i%2==0] # 返回1-10之间所有的偶数 [ i for i in range(1,10) if isprime(i)] # 返回1-10之间所有的质数,判断质数的函数是自定义的;

for…for…的嵌套 [ i+j for i in “abc” for j in “123”] # 返回”abc”和”123”的所有组合;

生成器

列表生成式可以直接创建一个列表,但列表容量受内存的限制;在Python中一边循环一边计算的机制,称为生成器(Generator);就是你需要多少,它就生成多少;

创建生成器的方法:

将列表生成式的[]改为();在定义的函数中加入yield关键字;

查看生成器元素的方式:

使用生成器的next方法;(不常用)生成器是可迭代的对象,直接通过for循环查看;

1, 1 , 1+1 max = 6 def fib(max): n,a,b = 0,1,1 while n < 6: print a a,b = b, a + b n = n + 1

高阶函数

内置的高阶函数

map

reduce

reduce(f,[1,2,3,4]) === > add(add(add(1,2),3),4) reduce(cheng,range(1,11))

求10的阶乘: reduce(lambda x,y: x*y, range(1,n))

filter

In [1]: def is_oushu(n): ….: if n%2 == 0: ….: return True ….: else: ….: return False ….:

In [2]: filter(is_oushu,range(1,11)) Out[2]: [2, 4, 6, 8, 10]

sorted() n [3]: l = ["a","Ab","cd","C"] In [4]: sorted(l) Out[4]: ['Ab', 'C', 'a', 'cd'] In [5]: def cmp_ignore_case(s1,s2): ....: s1 = s1.lower() ....: s2 = s2.lower() ....: if s1 < s2: ....: return -1 ....: elif s1 > s2: ....: return 1 ....: else: ....: return 0 ....: In [6]: sorted(l,cmp_ignore_case) Out[6]: ['a', 'Ab', 'C', 'cd']

练习1

输入一个正整数n,求n!(即阶乘)末尾有多少个0? 比如: n = 10; n! = 3628800,所以答案为2;

输入描述: 输入为一行,n(1 ≤ n ≤ 1000)

输出描述: 输出一个整数,即题目所求

示例1:

- 输入: 10 - 输出: 2

程序:

#!/usr/bin/env python # coding:utf-8 n = input('请输入要求的阶乘数:') sum = reduce(lambda x, y: x * y, range(1, n + 1)) print sum i = 0 while True: s = sum % 10 sum = sum / 10 if s == 0: i += 1 elif 10 < sum : break print i

运行结果:

转载请注明原文地址: https://www.6miu.com/read-19188.html

最新回复(0)