#学python的一天天 day3

使用dict和set

dict字典,采用键值对的方式进行存储,具有比较快的查找速度
如果要查找一个同学的成绩,用之前的列表来做的话,像下面这样子

names = ['Michael', 'Bob', 'Tracy']
scores = [95, 75, 85]
for i in range(0,3):
    if names[i]=='Bob':
        print(scores[i])

要对两个单独列表进行对应,那么字典直接是key,value对,这个问题就变得很简单了,构建一个name-score的字典,然后直接问key就得到了对应的value,时间从0.09837007522583008 ms到0.049695730209350586 ms【调用了time模块】

>>> dic={'Michael':95,'Bob':75,'Tracy':85}
>>> print(dic['Bob'])
75
from time import * 
begin_time=time()
dic={'Michael':95,'Bob':75,'Tracy':85}
print(dic['Bob'])
end_time=time()
print(end_time-begin_time)

第一种是列表的形式从新往后翻,比较慢。第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字。
创建字典的方式很多种,也可以将键值对添加至词典,由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉:

dic={'Michael':95,'Bob':75,'Tracy':85}
dic['Liming']=98
print(dic)

我们在查找key-value时候,要首先判断一下key在不在,不在的话会报错
可以用in直接判断

dic={'Michael':95,'Bob':75,'Tracy':85}
>>> 'Liming' in dic
False

还可以接着dict.get(key)看结果,当然这个结果可以给定。下面这个例子说明字典没有’Liming‘,这个函数还可以直接提取key所对应的value。注意:返回None的时候Python的交互环境不显示结果。

>>> dic.get('Liming',-1)
-1

要删除一个key,可以用dict.pop(key)

>>> d.pop('Bob')
75
>>> d
{'Michael': 95, 'Tracy': 85}

dict里面的东西是没有顺序的。【面试了我一个问题:将字典值按照大小顺序排列】

和list比较,dict有以下几个特点:

查找和插入的速度极快,不会随着key的增加而变慢;
需要占用大量的内存,内存浪费多。
而list相反:

查找和插入的时间随着元素的增加而增加;
占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法
dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是**不可变对象。**比如数值,字符串是不可变的,而列表是可变的。
【面试了我一个问题:将字典值按照大小顺序排列】
具体怎么解决呢?来一起瞅瞅看
sorted(iterable, cmp=None, key=None, reverse=False)
参数说明:
iterable – 可迭代对象。
cmp – 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
那么这个题有思路了:
首先创建一个打乱值的字典

dic={'w':23,'b':18,'f':89,'c':78}

接着使用sorted()函数

sorted(dic.items(),key=lambda x:x[1],reverse=False)

这里要对其value一个值进行排序的话,想到用key来比较元素,返回第二个值
得到结果[('b', 18), ('w', 23), ('c', 78), ('f', 89)]
再看一个例子:按年龄从小到大排序
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
sorted(students,key=lambda x:x[2],reverse=False)

set

集合:无序、不重复。重复元素在set中自动被过滤
set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:

>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
{2, 3}
>>> s1 | s2
{1, 2, 3, 4}

对于可变对象是对其进行操作会改变内部结构,而不可变对象对本质是不可改变的,常见的不可变对象有:数值,字符串,元组,可变对象有:列表,字典
所以,对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。

**补充知识:**lambda是匿名函数,在接下来的学习中还会碰到它的

MAXIMUM = lambda x,y :  (x > y) * x + (x < y) * y
MINIMUM = lambda x,y :  (x > y) * y + (x < y) * x
 
if __name__ == '__main__':
    a = 10
    b = 20
    print ('The largar one is %d' % MAXIMUM(a,b))
    print ('The lower one is %d' % MINIMUM(a,b))

调用函数

abs是一个取绝对值的函数,再调用函数的时候我们要注意传参的问题。当然我们可以用help的方式查看这个函数的一些解释。abs(-10)得到的结果是10
可以插件按
max(arg1,arg2…)可以有很多参数,返回最大那个
min(arg1,arg2…)可以有很多参数,返回最小那个

>>> max(1,2,3,4,5,6,7,8)
8

数据类型转换:有int,str,float,bool类型之间的转换
bool类型要注意的是:除了0,null和None都是True

>>> bool(None)
False
>>> bool('123')
True
>>> bool('')
False

练习
请利用Python内置的hex()函数把一个整数转换成十六进制表示的字符串:
在这里插入图片描述
查了一下hex()函数,我们就可以直接操作了

n1 = 255
n2 = 1000
print(hex(n1))
print(hex(n2))

我用type()查了一下,这个输出就是<class 'str'>

定义函数

在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。
练习:定义一个函数求解list中的最大值

def fun(nums):#def定义 fun函数名 nums传递的参数 :这个是结构
    return max(nums)#return返回值 缩进里面可以写循环体
fun([1,2,3,4,5,6,7,8,9]) #调用函数fun

结果如下

>>> fun([1,2,3,4,5,6,7,8,9])
9

函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑。

如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。return None可以简写为return。

空函数占位,让代码可以运行起来,想好了要写什么后续过程中再补充完整

def f():
    pass

参数检查
参数出错时候会异常,这个时候我们需要对定义的函数进行完善,而内置的函数会出现提示,自定义函数不提示。

返回多个值
return可以返回多个值,以tuple的形式返回,比如这个例子

>>> def move(x, y, step, angle=0):
...     nx = x + step * math.cos(angle)
...     ny = y - step * math.sin(angle)
...     return nx, ny
...
>>> move(100,100,60,math.pi/6)
(151.96152422706632, 70.0)

小结

  • 定义函数时,需要确定函数名和参数个数;
  • 如果有必要,可以先对参数的数据类型做检查;
  • 函数体内部可以用return随时返回函数结果;
  • 函数执行完毕也没有return语句时,自动return None。
  • 函数可以同时返回多个值,但其实就是一个tuple。
    在这里插入图片描述
from math import *
def quadratic(a,b,c):
    p=b**2-4*a*c
    if p==0:
        x=(-b+math.sqrt(p))/2*a 
        return x
    else:
        x1=(-b+math.sqrt(p))/2*a 
        x2=(-b-math.sqrt(p))/2*a 
        return x1,x2

question:

  • 这个代码满足了实数的要求,对于虚数还未解决,怎么办呢?
  • 能不能做到循环求解呢?

带着这些问题,来完善代码:

import cmath #进行复数求解
import math
def quadratic(a,b,c):
    p=b**2-4*a*c
    if p==0:
        x=(-b+math.sqrt(p))/2*a 
        return x
    elif p<0:
        x1=(-b+cmath.sqrt(p))/2*a 
        x2=(-b-cmath.sqrt(p))/2*a 
        return x1,x2
    elif p>0:
        x1=(-b+math.sqrt(p))/2*a 
        x2=(-b-math.sqrt(p))/2*a 
        return x1,x2
n=True
while n:
    stop=int(input('输入数字1开始计算,0的话停止计算:'))
    if stop ==1:
        a=float(input('输入第一个数:'))
        b=float(input('输入第二个数:'))
        c=float(input('输入第三个数:'))
        print('{}x^2+{}x+c=0方程得到的解是:'.format(a,b,c),quadratic(a,b,c))
    else:
        print('停止计算')
        n=False

结果如下:

输入数字1开始计算,0的话停止计算:1
输入第一个数:1
输入第二个数:2
输入第三个数:1
1.0x^2+2.0x+c=0方程得到的解是: -1.0

在后面的学习中在对输入进行判断,还有检错的代码学习。
今天学习到这里吧,又是满满收获的一天!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值