概述
文章目录
- 一、集合
- tips?
- 习题
- 二、序列
- tip
- 习题
- 三、函数与Lambda表达式
- tips
- 函数参数
- 变量作用域
- 习题
- 总结
一、集合
tips?
num = {}
print(type(num)) # <class 'dict'>
num = {1, 2, 3, 4}
print(type(num)) # <class 'set'>
basket = set() # 创建一个空的集合。
注意创建一个空的集合不能直接令一个变量等于{},需要令他等于set(),一定要注意,犯错!!!
lst = [0, 1, 2, 3, 4, 5, 5, 3, 1]
temp = []
for item in lst:
if item not in temp:
temp.append(item)
print(temp) # [0, 1, 2, 3, 4, 5]
a = set(lst)
print(list(a)) # [0, 1, 2, 3, 4, 5]
从结果发现集合的两个特点:无序 (unordered) 和唯一 (unique)。
由于 set
存储的是无序集合,所以我们不可以为集合创建索引或执行切片(slice)操作,也没有键(keys)可用来获取集合中元素的值,但是可以判断一个元素是否在集合中。
这里的无序,指的是集合中的数字不能通过索引不能找到集合中的数。排序是不定的哦。
唯一性:可以通过强制转换将列表等序列内的值通过集合滤去重复的值。
可以使用for
把集合中的数据一个个读取出来。
s = set(['Google', 'Baidu', 'Taobao'])
for item in s:
print(item)
# Baidu
# Google
# Taobao
set.update(set)
用于修改当前集合,可以添加新的元素或集合到当前集合中,如果添加的元素在集合中已存在,则该元素只会出现一次,重复的会忽略。
x = {"apple", "banana", "cherry"}
y = {"google", "baidu", "apple"}
x.update(y)
print(x)
# {'cherry', 'banana', 'apple', 'google', 'baidu'}
set.discard(value)
用于移除指定的集合元素。remove()
方法在移除一个不存在的元素时会发生错误,而 discard()
方法不会。
fruits = {"apple", "banana", "cherry"}
fruits.discard("banana")
print(fruits) # {'apple', 'cherry'}
set.pop()
用于随机移除一个元素。
fruits = {"apple", "banana", "cherry"}
x = fruits.pop()
print(fruits) # {'cherry', 'apple'}
print(x) # banana
习题
1、怎么表示只包含一个数字1的元组。
答:先将元组转换成集合,再将集合转换成元组。
i = (0, 1, 2, 2, 1, 3)
j = set(i)
i = tuple(j)
print(i) # (0, 1, 2, 3)
2、创建一个空集合,增加 {‘x’,‘y’,‘z’} 三个元素。
答:先用set函数创建一个空集合,切记不能直接将{}
赋值给变量哦。然后再将这个集合更新到空集合里面。
a = set()
b = {'x','y', 'z'}
a.update(b)
print(a) # {'z', 'x', 'y'}
3、列表[‘A’, ‘B’, ‘A’, ‘B’]去重。
答:先将列表转换成集合,后再转换成列表。
c = set(['A', 'B', 'A', 'B'])
print(list(c)) # ['B', 'A']
4、求两个集合{6, 7, 8},{7, 8, 9}中不重复的元素(差集指的是两个集合交集外的部分)。
答:因为输出的是两个集合不重复的元素,使用差集函数的话,只能输出其中一个集合的不重复元素,所以我选用了求异或函数实现题目。
d = {6 ,7, 8}
e = {7, 8, 9}
f = d.symmetric_difference(e)
print(f) # {9, 6}
5、求{‘A’, ‘B’, ‘C’}中元素在 {‘B’, ‘C’, ‘D’}中出现的次数。
答:输出第一个集合在第二个集合中出现的次数,则:
g = {'A', 'B', 'C'}
h = {'B', 'C', 'D'}
for item in g:
if item in h:
print("%s : 1" %item, end=' ')
else:
print("%s : 0" %item, end= ' ') # C : 1 B : 1 A : 0
二、序列
tip
sorted(iterable, key=None, reverse=False)
对所有可迭代的对象进行排序操作。
①iterable值可迭代对象,比如列表,字符串,元组
②key=None,key的默认值是None,key是什么呢?key 参数是指定用来比较排序的参数,可以自定义排序规则(启发:自定义排序规则 --> 自定义函数 --> lambda表达式)
③reverse 参数指定以升序(False,默认)还是降序(True)进行排序
x = [-8, 99, 3, 7, 83]
print(sorted(x)) # [-8, 3, 7, 83, 99]
print(sorted(x, reverse=True)) # [99, 83, 7, 3, -8]
t = ({"age": 20, "name": "a"}, {"age": 25, "name": "b"}, {"age": 10, "name": "c"})
x = sorted(t, key=lambda a: a["age"])
print(x)
# [{'age': 10, 'name': 'c'}, {'age': 20, 'name': 'a'}, {'age': 25, 'name': 'b'}]
- 乌拉
习题
1、怎么找出序列中的最大、最小值?
答:使用max()
和min()
函数找到序列中的最大、最小值。
print(max([-8, 99, 3, 7, 83])) # 99
print(min([-8, 99, 3, 7, 83])) # -8
2、sort() 和 sorted() 区别
答:sort()
函数只对列表进行排序,sorted()
对所有可迭代的对象进行排序操作。
x = [123, 456, 789, 213]
x.sort()
print(x)
# [123, 213, 456, 789]
t = ({"age": 20, "name": "a"}, {"age": 25, "name": "b"}, {"age": 10, "name": "c"})
x = sorted(t, key=lambda a: a["age"])
print(x)
# [{'age': 10, 'name': 'c'}, {'age': 20, 'name': 'a'}, {'age': 25, 'name': 'b'}]
3、怎么快速求 1 到 100 所有整数相加之和?
答:
print(sum(range(0, 101))) # 5050
4、求列表 [2,3,4,5] 中每个元素的立方根。
答:
d = [2, 3, 4, 5]
e = [i ** 3 for i in d]
print(e) #[8, 27, 64, 125]
5、将[‘x’,‘y’,‘z’] 和 [1,2,3] 转成 [(‘x’,1),(‘y’,2),(‘z’,3)] 的形式。
答:用zip()
函数对两个列表进行打包处理。
f = ['x', 'y', 'z']
g = [1, 2, 3]
z = zip(f, g)
print(list(z)) #[('x', 1), ('y', 2), ('z', 3)]
三、函数与Lambda表达式
tips
函数参数
Python 的函数具有非常灵活多样的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。从简到繁的参数形态如下:
- 位置参数 (positional argument)
- 默认参数 (default argument)
- 可变参数 (variable argument)
- 关键字参数 (keyword argument)
- 命名关键字参数 (name keyword argument)
- 参数组合
1. 位置参数
def functionname(arg1):
"函数_文档字符串"
function_suite
return [expression]
arg1
- 位置参数 ,这些参数在调用函数 (call function) 时位置要固定。
2. 默认参数
def functionname(arg1, arg2=v):
"函数_文档字符串"
function_suite
return [expression]
arg2 = v
- 默认参数 = 默认值,调用函数时,默认参数的值如果没有传入,则被认为是默认值。- 默认参数一定要放在位置参数 后面,不然程序会报错。
【例子】
def printinfo(name, age=8):
print('Name:{0},Age:{1}'.format(name, age))
printinfo('小马') # Name:小马,Age:8
printinfo('小马', 10) # Name:小马,Age:10
- Python 允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
【例子】
def printinfo(name, age):
print('Name:{0},Age:{1}'.format(name, age))
printinfo(age=8, name='小马') # Name:小马,Age:8
3. 可变参数
顾名思义,可变参数就是传入的参数个数是可变的,可以是 0, 1, 2 到任意个,是不定长的参数。
def functionname(arg1, arg2=v, *args):
"函数_文档字符串"
function_suite
return [expression]
*args
- 可变参数,可以是从零个到任意个,自动组装成元组。- 加了星号(*)的变量名会存放所有未命名的变量参数。
【例子】
def printinfo(arg1, *args):
print(arg1)
for var in args:
print(var)
printinfo(10) # 10
printinfo(70, 60, 50)
# 70
# 60 这两个存再*args里面组成元组
# 50
4. 关键字参数
def functionname(arg1, arg2=v, *args, **kw):
"函数_文档字符串"
function_suite
return [expression]
**kw
- 关键字参数,可以是从零个到任意个,自动组装成字典。
【例子】
def printinfo(arg1, *args, **kwargs):
print(arg1)
print(args)
print(kwargs)
printinfo(70, 60, 50)
# 70
# (60, 50)
# {}
printinfo(70, 60, 50, a=1, b=2)
# 70
# (60, 50)
# {'a': 1, 'b': 2}
「可变参数」和「关键字参数」的同异总结如下:
- 可变参数允许传入零个到任意个参数,它们在函数调用时自动组装为一个元组 (tuple)。
- 关键字参数允许传入零个到任意个参数,它们在函数内部自动组装为一个字典 (dict)。
5. 命名关键字参数
def functionname(arg1, arg2=v, *args, *, nkw, **kw):
"函数_文档字符串"
function_suite
return [expression]
*, nkw
- 命名关键字参数,用户想要输入的关键字参数,定义方式是在nkw 前面加个分隔符 *。- 如果要限制关键字参数的名字,就可以用「命名关键字参数」
- 使用命名关键字参数时,要特别注意不能缺少参数名。
【例子】
def printinfo(arg1, *, nkw, **kwargs):
print(arg1)
print(nkw)
print(kwargs)
printinfo(70, nkw=10, a=1, b=2)
# 70
# 10
# {'a': 1, 'b': 2}
printinfo(70, 10, a=1, b=2) #命名关键字参数时前面一定要加上参数’名称=‘,不然会报错(不一定是nkw)
# TypeError: printinfo() takes 1 positional argument but 2 were given
- 没有写参数名
nwk
,因此 10 被当成「位置参数」,而原函数只有 1 个位置函数,现在调用了 2 个,因此程序会报错。
6. 参数组合
在 Python 中定义函数,可以用位置参数、默认参数、可变参数、命名关键字参数和关键字参数,这 5 种参数中的 4 个都可以一起使用,但是注意,参数定义的顺序必须是:
- 位置参数、默认参数、可变参数和关键字参数。
- 位置参数、默认参数、命名关键字参数和关键字参数。 反正字典要放在最后就是了。
要注意定义可变参数和关键字参数的语法:
*args
是可变参数,args
接收的是一个tuple
**kw
是关键字参数,kw
接收的是一个dict
命名关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。定义命名关键字参数不要忘了写分隔符 *
,否则定义的是位置参数。
警告:虽然可以组合多达 5 种参数,但不要同时使用太多的组合,否则函数很难懂。
变量作用域
- Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。
- 定义在函数内部的变量拥有局部作用域,该变量称为局部变量。
- 定义在函数外部的变量拥有全局作用域,该变量称为全局变量。
- 局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。
【例子】
def discounts(price, rate):
final_price = price * rate
return final_price
old_price = float(input('请输入原价:')) # 98
rate = float(input('请输入折扣率:')) # 0.9
new_price = discounts(old_price, rate)
print('打折后价格是:%.2f' % new_price) # 88.20
- 当内部作用域想修改外部作用域的变量时,就要用到
global
和nonlocal
关键字了。
这里的nonlocal是怎么用的?
局部作用域:内层函数对外层函数的局部变量进行修改
就是说两个函数嵌套的时候,里面的那个函数使用nonlocal可以调用外面函数的变量值❤
而不是只有一个函数,从这个函数里面对全局变量进行修改。。❤❤
闭包和递归到底是什么,我们可以查看这位大神所给出的解释。还有看一送一的lambda表达式哦。
https://blog.csdn.net/weixin_51503843/article/details/109231048
习题
1、怎么给函数编写文档?
答:在函数中双引号""
为注释,#
井号也为注释,但当使用.__doc__
打印出此函数时,只有双引号内的内容被打印出来,井号的
def MyFirstFunction(name):
"函数定义过程中name是形参"
# 因为Ta只是一个形式,表示占据一个参数位置
print(MyFirstFunction.__doc__)
# 函数定义过程中name是形参
2、怎么给函数参数和返回值注解?
答: x: int
, y: int
说明了输入的两个参数都是int , -> int
说明返回值也是int 。
def func(x: int, y: int) -> int:
return x+y
3、闭包中,怎么对数字、字符串、元组等不可变元素更新。
答:如果要修改闭包作用域中的变量则需要 nonlocal
关键字。
def outer():
num = 10
def inner():
nonlocal num # nonlocal关键字声明
num = 100
print(num)
inner()
print(num)
outer()
# 100
# 100
4、分别根据每一行的首元素和尾元素大小对二维列表 a = [[6, 5], [3, 7], [2, 8]] 排序。(利用lambda表达式)
答:此处我们需要用到排序的sorted()
函数对二维列表a进行排序。
a = [[6, 5], [3, 7], [2, 8]]
print(sorted(a, key = lambda a: a[0]))
5、利用python解决汉诺塔问题?
有a、b、c三根柱子,在a柱子上从下往上按照大小顺序摞着64片圆盘,把圆盘从下面开始按大小顺序重新摆放在c柱子上,尝试用函数来模拟解决的过程。(提示:将问题简化为已经成功地将a柱上面的63个盘子移到了b柱)
答:想不出来,所以贴了别人的代码:
def hannuota(num, a, b, c):
if num == 1: # 如果只有一片
print(a, '-->', c) # 那就直接把它从a柱移动c柱
else: # 两片以上的话
hannuota(num-1, a, c, b) # 先把 num-1 片移到b柱
print(a, '-->', c) # 在把最底层的那片移到c柱
hannuota(num-1, b, a, c) # 接下来就是想办法把b柱上面的移到c柱了
num = int(input('请输入片数:')) # 片数由我们来自己手动输入
hannuota(num, 'a', 'b', 'c') # 在此调用函数,柱子a,b,c就默认使用形参吧
总结
。冲冲冲。
最后
以上就是细腻便当为你收集整理的集合序列函数习题一、集合二、序列三、函数与Lambda表达式总结的全部内容,希望文章能够帮你解决集合序列函数习题一、集合二、序列三、函数与Lambda表达式总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复