python -day7
补:
pass 语句
Python pass是空语句,是为了保持程序结构的完整性。
pass 不做任何事情,一般用做占位语句
eg;
if 1:pass;
if 后面要有语句,如果什么都不需要,就可以用pass语句做占位语句,保证程序结构的完整性。
基础语法已经学完,尝试写些小东西;
eg:斐波那契数列
n1=0;
n2=1;
n=0;
n3=0;
while n<10:n3=n1+n2;print(n3);n1=n2;n2=n3;n=n+1;
运行结果如下:
或者:
n1=0;
n2=1;
n=0;
n3=0;
while n<10:n1,n2=n2,n1+n2; #这个先完成等式右边的运算,再赋值给等式左边的变量n=n+1; print(n2,end=" ");
运行结果
推导式
Python 推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。
Python 推导式是一种强大且简洁的语法,适用于生成列表、字典、集合和生成器。
在使用推导式时,需要注意可读性,尽量保持表达式简洁,以免影响代码的可读性和可维护性。
Python 支持各种数据结构的推导式:
- 列表(list)推导式
- 元组(tuple)推导式
- 字典(dict)推导式
- 集合(set)推导式
列表推导式
[表达式 for 变量 in 列表]
[out_exp_res for out_exp in input_list]或者 [表达式 for 变量 in 列表 if 条件]
[out_exp_res for out_exp in input_list if condition]
- out_exp_res:列表生成元素表达式,可以是有返回值的函数。
- for out_exp in input_list:迭代 input_list 将 out_exp 传入到 out_exp_res 表达式中。
- if condition:条件语句,可以过滤列表中不符合条件的值。
eg:
#计算 30 以内可以被 3 整除的整数:n=[i for i in range(30) if i%3==0]#range(30)生成0-29的整数序列,if i%3==0判断是否能被3整除,符合条件的整数序列存入n列表
print(n);#过滤掉长度小于或等于3的字符串列表,并将剩下的转换成大写字母:words=["qqq","www","eeee","rrr","tttt","yyyy"];
new_words=[word.upper() for word in words if len(word)>3];
#word.upper()将字符串word转换成大写字母
#len(word)>3判断字符串长度是否大于3,符合条件的字符串序列存入new_words列表
print(new_words);
运行结果:
字典推导式
{ key_expr: value_expr for value in collection }或{ key_expr: value_expr for value in collection if condition }
key_expr:字典的键值
value_expr:字典的键值对应的值
value:从collection中提取的值,它也会被传到,key_expr和value_expr的表示式中。
eg:
#使用字符串及其长度创建字典:
listdemo = ['Google','Runoob', 'Taobao'];
dict1={len(i):i for i in listdemo};
print(dict1);#提供三个数字,以三个数字为键,三个数字的平方为值来创建字典:
n=[2,3,4];
n_dict={i:i**2 for i in n};#*表示乘方运算,**表示幂运算
print(n_dict);
运行结果:
这里可以思考一下为什么dict1这个字典只有一个键和对应的值。
-
-
-
-
-
因为listdemo中的每个字符串的长度都是6,所以在创建dict1时,每个键 i 都是 6,如果键值相同,则只保留最后一个。
这里有另一个问题是:如果我想创造的字典键和值来自于不同的序列,应该怎么做?
我查到的是使用 zip()函数,注意 zip 会截断到较短的列表;
zip 会“截断到较短的列表”的意思是:zip 只按最短的可迭代对象长度配对,超过最短长度的元素会被丢弃(不会成对出现)。
zip()函数
eg:
#使用n的元素作为键,listdemo的元素作为值来创建字典:
listdemo = ['Google','Runoob', 'Taobao'];
n=[1,2,3,4];
dict1={k:v for k,v in zip(n,listdemo)};#zip函数会截断较短的序列,因此这里k,v的长度为3
print(dict1);
运行结果:
eg:也可以使用索引
#使用n的元素作为键,listdemo的元素作为值来创建字典:
listdemo1 = ['Google','Runoob', 'Taobao'];
n1=[1,2,3,4];listdemo2 = ['Google','Runoob', 'Taobao'];
n2=[1,2,3,4];dict1={k:v for k,v in zip(n1,listdemo1)};#zip函数会截断较短的序列,因此这里k,v的长度为3dict2={n2[i]:listdemo2[i] for i in range(min(len(n2),len(listdemo2)))};#使用索引
#min(len(n),len(listdemo))会返还两个列表中较短的长度print(listdemo1,listdemo2,n1,n2)
print(dict1,dict2);
运行结果:
集合推导式
{ expression for item in Sequence }
或
{ expression for item in Sequence if conditional }
他们的这些格式都是很一致的了,只有小部分不同。
eg:
n={i*2 for i in range(5)};
print(n);
print(type(n));
运行结果;
n={i for i in"ancoiasucaiwbauwic" if i not in "abc"};
print(n);
运行结果;
注意:集合是一个无序不重复的序列,内部元素不会重复。
元组推导式(生成器表达式)
元组推导式可以利用 range 区间、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的元组。
元组推导式基本格式:
(expression for item in Sequence )
或
(expression for item in Sequence if conditional )
元组推导式和列表推导式的用法也完全相同,只是元组推导式是用 () 圆括号将各部分括起来,而列表推导式用的是中括号 [],另外元组推导式返回的结果是一个生成器对象。
关于生成器对象简单问了一下ai:
生成器对象就是一个“惰性的、按需生产的工厂”。
惰性/按需:它不会一次性把所有数据都计算出来并塞进内存,而是你要一个,它才算一个,给你一个。
只能迭代一次:就像售货机里的可乐,掉出来就没了。生成器被遍历一次后,再想
next()
就没东西了,会抛出StopIteration
异常。节省内存:这是它最大的优点!当你处理海量数据(比如处理一个几十GB的日志文件,或者从数据库查询百万条记录)时,如果用列表,内存会瞬间爆炸。而用生成器,你永远只在内存中保持当前正在处理的一条数据。
个人理解就是生成器对象的内容不会一次全部调入内存,而是你每次使用一次next()函数,他就会给你一个它的内容,同时清除这个内容,然后再次使用,会给你下一个内容,这样会节省内存空间,它类比了一下售卖机(生成器对象),你每次投币(调用next()函数,()内是生成式对象),它就会给你一罐可乐(生成器的内容,这罐可乐给你了,售卖机里面就没有了,也就是声生成式对象里面就没有这个内容了)。
eg:
n=(i for i in range(10));#生成器表达式
print(n);
print(type(n));
print(tuple(n));#tuple函数将生成器转换成元组
运行结果:
generator 就是生成器对象的类型。