简单,一笔带过
C=float(input('输入合适的摄氏度C:'))
#input函数的类型转换,初始为字符串
F=9*C/5+32
print("对应的华摄氏度为%.2f"%F)
其功能是将一个输入的字符串转换成一个python表达式,这个机制可以动态地生成运行代码
a=eval('1+1')
print(a)
输出结果自然是:
2
更加深入地理解一下:
a=eval('1.2')
print(type(a))
输出:
<class 'float'>
可见eval函数相当于解析字符串内部的内容而直接忽略掉引号
from math import *
a=eval('exp(2)')
print('%.2f'%a)
print(type(a))
输出
7.39
<class 'float'>
如果要用eval解析一个字符串:
print(type(eval('"ZDZ很帅"')))
这里必须嵌套两个引号,单引号或双引号谁在外面都可以,才能够只被eval解析一层而输出
<class 'str'>
我试了一下,如果只有一层,会输出
NameError: name 'ZDZ很帅' is not defined
也就是说这里引号内内容被认为是一个没有被定义的变量名
################################################
1月6日继续(标明日期可以彻底说明我的懒惰,哎~~)
eval函数可以根据用户的输入将其转变成相应的类型,看这样一段代码:
n1=eval(input('n1='))
n2=eval(input('n2='))
n=n1+n2
print('%s + %s becomes %s\n with value %s'%(type(n1),type(n2),type(n),n))
这样测试时可以看到float与int相加成float,还可以列表、字符串等相加,注意输入字符串时要在外面加上引号:
#此为终端的输入内容
n1=n
Traceback (most recent call last):
File "c:\Users\lenovo\Desktop\python\ZDZ的博文模板.py", line 1, in <module>
n1=eval(input('n1='))
File "" , line 1, in <module>
NameError: name 'n' is not defined
可见第一个值输入即会报错,正确示例:
#此为终端内容
n1='n'
n2='m'
<class 'str'> + <class 'str'> becomes <class 'str'>
with value nm
功能是可以动态地执行复杂的python代码,比eval函数只能执行表达式字符串的功能强大得多,看个例子先意会一下它怎么用:
i=5
j=15
exec('answer=j/i')
print('答案是:%s'%answer)
输出:
答案是:3.0
这里我们注意到代码中使用了 %s,说明exec将 answer 解释成了一个字符串!!如果用 %.1f 呢:
答案是:3.0
啊这。。。也输出了,只能说python的容错能力太强大了。
好,继续:
可见,exec 函数执行了引号内的合理的代码,将结果赋给了变量answer,再看一个复杂的例子:
g='def f(n):\n\treturn 1 if n==1 else n*f(n-1)'
exec(g)
print(f(6))
这里 g 的字符串内是一段符合 python 语法规则的定义阶乘函数的代码,包括换行与制表符也要合乎情理,从而可以被exec解析,成功把 f(n) 定义了出来,输出结果为:
720
而 exec 的实际应用价值在于调用一些代码,比如说我已经定义了一个函数,并且将它写入了文件1.txt(为了避开路径问题以便于调用,将文件放在相同文件夹可直接调用):
def f(n):
return n**3
print(f(6))
现在我想调用它:
with open('1.txt','r') as f:
s=f.read()
exec(s)
输出:
216
以此类推,无论多么复杂的代码,我可以保存于文件中用 exec 调用,而它的朴素的本质是 open 文件后默认是字符串,因此可以用 exec 直接调用内容
######################################################
1月7日 19:00
字典可以储存任意类型的对象,每个键值key与value用 : 分割,类比于列表用 [ ] 合并,字典用 { } ,每个元素即 item 用逗号隔开,形如:
dic={
key1:value1,key2:value2,key3:value3,...}
其中规定key是唯一不可变的,如字符串,整型,浮点型,但值(的数据类型)任意,每个 key : value 称作一个 item
访问键值的方法:
color={
'apple':'red','banana':'yellow','grape':'purple'}
print(color['apple'])
即字典名后面加中括号里的 key 名称,当然输入未定义的 key 会报错:
##终端说:
Traceback (most recent call last):
File "c:\Users\lenovo\Desktop\python\ZDZ的博文模板.py", line 2, in <module>
print(color['orange'])
KeyError: 'orange'
继续修改上述代码:
color={
'apple':'red','banana':'yellow','grape':'purple'}
color['apple']='green'
color['orange']='orange'
print(color['apple'])
print(color['orange'])
第二行直接修改了 apple 的键值,第三行会默认直接加上新的 item,删除操作:
del color['apple'] #删除键'apple'
color.clear() #清空字典
del color #删除字典
字典被删除后当然不可再调用
值得注意的是,同一个字典的 key 名称不能重复,否则系统取***后者***为实际值,而且,key 的类型不能是 list ,但可以是 tuple
下面整理一些字典的内置函数与方法:
#len()
#计算 item 个数
len(dict)
#str()
#输出字符串形式的可打印的字典(即在外面加上引号),可以用 eval() 还原
str(dict)
#清空字典
dict.clear()
#返回一个字典的浅复制
dict.copy()
暂停一下,让我们先搞懂什么是浅复制与深复制:
这是一件很有意思的事情,浅复制是说 b=a.copy() 后 b 复制了 a 的第一层元素,没有复制深层的元素,可以理解为深层的元素仍然被别人左右着,即修改 a 的最外层元素时 b 不会发生变化,但修改 a 的更深层元素时 b 会随之改变:
a=[1,2,3,[4,5]]
b=a.copy()
a[1]=1
print(a)
print(b)
a[3][1]=1
print(a)
print(b)
############
#终端输出:
[1, 1, 3, [4, 5]]
[1, 2, 3, [4, 5]]
[1, 1, 3, [4, 1]]
[1, 2, 3, [4, 1]]
那么深复制就是复制后就与原对象没有了任何联系,只是开始与之一模一样而已,代码为:
a=[1,2,3,[4,5]]
import copy
b=copy.deepcopy(a)
print(b)
注意代码有较大变化,调用了 copy 库,事实上浅拷贝也可以写成:
a=[1,2,3,[4,5]]
import copy
b=copy.copy(a)
print(b)
继续我们的字典的内置函数与方法:
# dict.items()
#返回以每组 key 与 value 组成的元组为元素的列表,有点拗口,看例子
color={
'apple':'red','banana':'yellow','grape':'purple'}
a=color.items()
print(a)
#输出:
dict_items([('apple', 'red'), ('banana', 'yellow'), ('grape', 'purple')])
#其中 dict_items([...])是系统加上的
# pop() 函数
#删除字典某个 key 对应的值,返回值是被删除的值,与此同时字典也被‘瘦身’了:
```python
color={
'apple':'red','banana':'yellow','grape':'purple'}
a=color.pop('apple')
b=color.pop('banana')
print(a,end='\t')
print(b)
print(color)
输出:
red yellow
{
'grape': 'purple'}
dict.keys():
#返回一个迭代器,可以用 list 转换为列表
color={‘apple’:‘red’,‘banana’:‘yellow’,‘grape’:‘purple’}
a=color.keys()
print(a)
print(list(a))
#输出:
dict_keys([‘apple’, ‘banana’, ‘grape’])
[‘apple’, ‘banana’, ‘grape’]
#迭代器?再插入一段吧:
迭代器是访问集合元素的一种方式,是一个可以记住遍历位置的对象,它从第一个元素开始访问,直到所有的元素被访问完结束,它只能往前不可以后退,有两个基本方法:iter() 与 next(),字符串,列表,元组对象都可以用于创建迭代器:
list=[1,2,3]
n=iter(list) #创建迭代器对象
print(next(n))#从第一个元素开始输出下一个对象
print(next(n))
print(next(n))
print(next(n))#不可以超出范围(迭代器已经停止)
输出:
1
2
3
Traceback (most recent call last):
File "c:\Users\lenovo\Desktop\python\ZDZ的博文模板.py", line 6, in <module>
print(next(n))
StopIteration
类似得:
str='123'
n=iter(str) #创建迭代器对象
print(next(n))#从第一个元素开始输出下一个对象
print(next(n))
print(next(n))
print(next(n))#不可以超出范围(迭代器已经停止
#输出:
1
2
3
Traceback (most recent call last):
File "c:\Users\lenovo\Desktop\python\ZDZ的博文模板.py", line 6, in <module>
print(next(n))
StopIteration
以及:
tuple=(1,2,3)
n=iter(tuple) #创建迭代器对象
print(next(n))#从第一个元素开始输出下一个对象
print(next(n))
print(next(n))
print(next(n))#不可以超出范围(迭代器已经停止)
#输出:
1
2
3
Traceback (most recent call last):
File "c:\Users\lenovo\Desktop\python\ZDZ的博文模板.py", line 6, in <module>
print(next(n))#不可以超出范围(迭代器已经停止)
StopIteration
另外,迭代器对象可以使用 for 循环遍历:
list=[1,2,3]
n = iter(list) # 创建迭代器对象
for x in n:
print (x, end='')
显然这和:
list=[1,2,3]
#n = iter(list) # 创建迭代器对象
for x in list:
print (x, end=' ')
输出结果一样
(1月9日 周六 一下午)
另外还有 next() 函数:
import sys
str='zhaode'
i=iter(str)
while True:
try:
print(next(i),end=' ')
except StopIteration:
sys.exit()
我此时想写写 sys ,以后吧,不然跑题太远了,我们尽量针对期末考试,上面输出结果是:
z h a o d e
我们注意到调用 next ( ) 函数并不需要加任何前缀,此处用 sys 只是为了在迭代结束后退出循环
#####################################################
(啊,突然意识到自己跑题太远了,我还有事,前路漫漫,以后再找时间扩展,哎,但不得不说其余的干货也是十分有用的)