欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

我的自学Python之路(第二阶段Day9)

程序员文章站 2022-06-11 16:13:44
今天学习内容如下: 1.通常C/C++中,"/ " 算术运算符的计算结果是根据参与运算的两边的数据决定的,比如:6 / 3 = 2 ; 6,3都是整数,那么结果也就是整数2;6.0 / 3.0 = 2.0 ; 6.0,3.0是浮点数,那么结果也是浮点数2.0,跟精确的说,只要" / " 两边有一个数 ......

今天学习内容如下:

1.通常C/C++中,"/ " 算术运算符的计算结果是根据参与运算的两边的数据决定的,比如:6 / 3 = 2 ; 6,3都是整数,那么结果也就是整数2;6.0 / 3.0 = 2.0 ; 6.0,3.0是浮点数,那么结果也是浮点数2.0,跟精确的说,只要" / " 两边有一个数是浮点数,那么结果就是浮点数在Python2.2版本以前也是这么规定的,但是,Python的设计者认为这么做不符合Python简单明了的特性,于是乎就在Python2.2以及以后的版本中增加了一个算术运算符" // "来表示整数除法,返回不大于结果的一个最大的整数,而" / " 则单纯的表示浮点数除法,但是,为了折中,所有2.X版本中,也是为了向后兼容,如果要使用" // ",就必须加上一条语句:from __future__ import divisio一看到这句," / "就表示 浮点数除法,返回浮点结果;" // "表示整数除法。但是,预计在Python3.0发布时,就没有这种折中情况了,," / "就一定表示 浮点数除法,返回浮点结果;" // "表示整数除法

2.复习进度条

 

我的自学Python之路(第二阶段Day9)
import time
for i in range(0,101,2):
    time.sleep(0.1)
    char_num = i//2
    per_str = '\r%s%%  : %s\n' %(i, '*' * char_num)\     #此处\作用是字符串太长换行
    if i == 100 else '\r%s%% :%s' %(i,'*'*char_num)#
    print(per_str,end ='',flush = True)
print(123)
# for i in range(10):
#
#     s = 'ss%s\r'%i
#     print(s,end = '')
View Code

 3.内置函数

我的自学Python之路(第二阶段Day9)
# exec('print(123)')
# eval('print(123)')
# print(eval('1+2+3'))# 有返回值6
# print(exec('1+2+3'))#没有返回值None
# exec和eval都可以执行 字符串类型的代码
# eval有返回值  —— 有结果的简单计算
# exec没有返回值   —— 简单流程控制
# eval只能用在你明确知道你要执行的代码是什么
# code = '''for i in range(10):
#     print(i*'*')'''
# exec(code)


# code = 'for i in range(10):print(i)'
# # compilel = compile(code,'','exec')
# # exec(compile)
# exec(code)

# code = '1 + 2 + 3'
# compile2 = compile(code,'','eval')
# print(eval(compile2))
# eval(compile2)
# print(eval(code))

#

# name #执行后name变量有值
# "'pythoner'"



# 复数 —— complex
# 实数 : 有理数
#         无理数
# 虚数 :虚无缥缈的数
# 5 + 12j  === 复合的数 === 复数
# 6 + 15j

# 浮点数(有限循环小数,无限循环小数)  != 小数 :有限循环小数,无限循环小数,无限不循环小数
# 浮点数
    #354.123 = 3.54123*10**2 = 35.4123 * 10
# f = 1.781326913750135970
# print(f)

# print(bin(10))
# print(oct(10))
# print(hex(10))

# print(abs(-3))
# print(divmod(2,3))# div除法 mod取余
# print(divmod(3,5))

# print(round(2.4545))
# print(round(2.8546655444,5))
# print(pow(2,5))
# print(pow(5,4))
# print(pow(1,4,1))
# print(pow(2,4,2))#前两个数幂运算除以三个数取余

# ret = sum([1,2,3,4,5,6],10)
# print(ret)

print(min(1,2,3,4))
print(min(1,2,3,4,-3))
print(min(1,2,3,4,-3,key = abs))
print(min([1,2,3,4]))
print(max(1,2,3,4))
print(max(1,2,3,4,-3))
print(max(1,2,3,4,-3,key = abs))
print(max([1,2,3,4]))
View Code
我的自学Python之路(第二阶段Day9)
# list = [1,2,3]
# l = list.reverse()
# print(l)
# # print(list)

# list = [1,2,3]
# l = reversed(list)
# print(l)
# print(l.__next__())

# l = [1,2,3,4,4,5,8]
# s = slice(1,7,2)
# print(s)
# print(l[s])
# print(l[1:7:2])

# print(format('test', '<10'))
# print(format('test', '>40'))
# print(format('test', '^40'))

# 网络编程 只能传二进制
# 照片和视频也是以二进制存储
# html网页爬取到的也是编码

# b_array = bytearray('你好',encoding = 'utf-8')
# print(b_array)
# print(b_array[0])
# b_array[1]=255
# print(b_array)


# print(ord('a'))
# print(ord('1'))
# print(chr(97))
# print(ord('好'))

print(repr(1))
print(str(1))
print(repr('1'))
print(str('1'))
name = 'egg'
print('你好%r'%name)

name = 'egg'
print('你好%s'%name)
View Code

 

我的自学Python之路(第二阶段Day9)
# print(all(['a','','e']))
# print(all(['a','e']))
# print(all(['','e']))
#
# print(any(['a','','e']))
# print(any(['a','e']))
# print(any([0,'e']))
#

# l = [1,2,3,4]
# s = [1,2,3,4]
# m = [1,2,3,[4,5]]
# n = {1:2,3:4}
# for i in zip(l,s,m,n):
#     print(i)
#

# def func(x):
#     # return x % 2 == 1
#     if x > 10:
#         return x
# ret = filter(func,[1,23,4,5])
# print(ret)
# for i in ret:
#     print(i)

# def is_not_empty(s):
#     return s and len(s.strip()) > 0
# ret = filter(is_not_empty, ['test', None, '', 'str', '  ', 'END'])
# print(ret)
# for i in ret:
#     print(i)

# filter 执行了filter之后的结果集合 <= 执行之前的个数
        #filter只管筛选,不会改变原来的值
# map 执行前后元素个数不变
      # 值可能发生改变
# from math import sqrt
# def func(num):
#     res = sqrt(num)
#     return res % 1 == 0
# ret = filter(func,range(1,101))
# for i in ret:
#     print(i)

# ret = map(abs,[12,-3,4,5])
# print(ret)
# for i in ret:
#     print(i)

# l = [1,23,4,-5,-6,6]
# # print(l.sort(key = abs)) # 在原列表的基础上进行排序
# # print(l)
#
# print(sorted(l,key = abs,reverse = True))# 生成了一个新列表 不改变原列表 占内存
# print(l)


l = ['  ', '2','34','dfsdsdffsd']
print(sorted(l,key = len))
View Code

4.匿名函数

 

我的自学Python之路(第二阶段Day9)
# def add(x,y):
#     return x+y
# add = lambda x,y:x+y
# print(add(1,2))
#
# dic = {'key1':1,'key2':20,'key3':3}
# print(max(dic,key = lambda a:dic[a]))

#两道练习题目
# 1.下面程序的输出结果是:
# d = lambda p:p*2
# t = lambda p:p*3
# x = 2
# x = d(x)
# x = t(x)
# x = d(x)
# print(x)
# 2.现有两元组(('a'),('b')),(('c'),('d')),请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}]

# ret = zip(('a','b'),(('c'),('d')))
# # def func(x):
# #     return {x[0]:x[1]}
# res = map(lambda x:{x[0]:x[1]},ret)
# # for i in ret:
# #     print(i)
# print(list(res))


# 3.以下代码的输出是什么?请给出答案并解释。
# def multipliers():
#     return [lambda x:i*x for i in range(4)]
# print([m(2) for m in multipliers()])
# 请修改multipliers的定义来产生期望的结果。

def func():
    return 'ss'*i
for i in range(4):
    func()

print(func())
# def multipliers():
#     return [lambda x:0*x,lambda x:1*x,lambda x:2*x,lambda x:3*x]
# print([m(2) for m in lambda x:0*x,lambda x:1*x,lambda x:2*x,lambda x:3*x])



# dic={'k1':10,'k2':100,'k3':30}
# def func(key):
#     return dic[key]
# print(max(dic,key=func))   #根据返回值判断最大值,返回值最大的那个参数是结果
# print(max(dic,key=lambda key:dic[key]))
# max([1,2,3,4,5,-6,-7],key=abs)

# ret = map(abs,[-1,2,-3,4])
# for i in ret:
#     print(i)

# def func(x):
#     return x**2
# ret = map(func,[-1,2,-3,4])
# for i in ret:
#     print(i)
#
# ret = map(lambda x:x**2,[-1,2,-3,4])


# def func(x):
#     return x>10
#
# res = filter(func,[5,8,11,9,15])
# for i in res:
#     print(i)


# min max filter map sorted —— lambda

# d = lambda p:p*2
# t = lambda p:p*3
# x = 2
# x = d(x) #x = 4
# x = t(x) #x = 12
# x = d(x) #x = 24
# print(x)

# ret = zip((('a'),('b')),(('c'),('d')))
# ret = map(lambda t:{t[0]:t[1]},ret)
# print(list(ret))

#现有两元组(('a'),('b')),(('c'),('d')),
# 请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}]

# max min sorted filter map
# 匿名函数 == 内置函数
# zip
# ret = zip((('a'),('b')),(('c'),('d')))
# res = map(lambda tup:{tup[0]:tup[1]},ret)
# print(list(res))

# def multipliers():
#     return [lambda x:i*x for i in range(4)]
# print([m(2) for m in multipliers()])
View Code

 5.练习题

我的自学Python之路(第二阶段Day9)
# 3.用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb
name=['alex','wupeiqi','yuanhao','nezha']
# def func(item):
#     return item+'_sb'
# ret = map(func,name)   #ret是迭代器
# for i in ret:
#     print(i)
# print(list(ret))

# ret = map(lambda item:item+'_sb',name)
# print(list(ret))

# 4.用filter函数处理数字列表,将列表中所有的偶数筛选出来
# num = [1,3,5,6,7,8]
# def func(x):
#     if x%2 == 0:
#         return True
# ret = filter(func,num)  #ret是迭代器
# print(list(ret))
#
# ret = filter(lambda x:x%2 == 0,num)
# ret = filter(lambda x:True if x%2 == 0 else False,num)
# print(list(ret))

# 5.随意写一个20行以上的文件
# 运行程序,先将内容读到内存中,用列表存储。
# 接收用户输入页码,每页5条,仅输出当页的内容

# with open('file',encoding='utf-8') as f:
#     l = f.readlines()
# page_num = int(input('请输入页码 : '))
# pages,mod = divmod(len(l),5) #求有多少页,有没有剩余的行数
# if mod:           # 如果有剩余的行数,那么页数加一
#     pages += 1    # 一共有多少页
# if page_num > pages or page_num <= 0:   #用户输入的页数大于总数或者小于等于0
#     print('输入有误')
# elif page_num == pages and mod !=0:    #如果用户输入的页码是最后一页,且之前有过剩余行数
#     for i in range(mod):
#         print(l[(page_num-1)*5 +i].strip())  #只输出这一页上剩余的行
# else:
#     for i in range(5):
#         print(l[(page_num-1)*5 +i].strip())  #输出5行

# 6.如下,每个小字典的name对应股票名字,shares对应多少股,price对应股票的价格
# portfolio = [
#     {'name': 'IBM', 'shares': 100, 'price': 91.1},
#     {'name': 'AAPL', 'shares': 50, 'price': 543.22},
#     {'name': 'FB', 'shares': 200, 'price': 21.09},
#     {'name': 'HPQ', 'shares': 35, 'price': 31.75},
#     {'name': 'YHOO', 'shares': 45, 'price': 16.35},
#     {'name': 'ACME', 'shares': 75, 'price': 115.65}
# ]

# 6.1.计算购买每支股票的总价
# ret = map(lambda dic : {dic['name']:round(dic['shares']*dic['price'],2)},portfolio)
# print(list(ret))

# 6.2.用filter过滤出,单价大于100的股票有哪些
# ret = filter(lambda dic:True if dic['price'] > 100 else False,portfolio)
# print(list(ret))
# ret = filter(lambda dic:dic['price'] > 100,portfolio)
# print(list(ret))
View Code

6.递归函数

初识递归

递归的定义——在一个函数里再调用这个函数本身

现在我们已经大概知道刚刚讲的story函数做了什么,就是在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归

刚刚我们就已经写了一个最简单的递归函数。

我的自学Python之路(第二阶段Day9)
def story():
    print('sdf')
    story()
story()
View Code

递归的最大深度——997

正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去。但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是python为了杜绝此类现象,强制的将递归层数控制在了997

我们可以通过这种方式来修改递归的最大深度

我的自学Python之路(第二阶段Day9)
import sys
sys.setrecursionlimit(500)
def foo(n):
    print(n)
    n += 1
    foo(n)
foo(1)
View Code

7.二分查找算法

# 我们学习的算法 都是过去时
# 了解基础的算法 才能创造出更好的算法
# 不是所有的事情都能套用现成的方法解决的
# 有些时候会用到学过的算法知识来解决新的问题

# 二分查找算法 必须处理有序的列表
# l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
# 5000000 4999998
# 代码实现
我的自学Python之路(第二阶段Day9)
# 二分查找算法 必须处理有序的列表
l = [1,2,3,4,5,6,7,8,9,10]
def find(l,aim):
    mid_index = len(l)//2
    if l[mid_index] < aim:
        new_1 = l[mid_index+1 :]
        find(new_1,aim)
    elif l[mid_index] > aim:
        new_1 = l[:mid_index]
        find(new_1,aim)
    else:
        print('找到了',mid_index,l[mid_index])

find(l,4)
简单版二分法
我的自学Python之路(第二阶段Day9)
def find(l,aim,start = 0,end = None):
    end = len(l) if end is None else end
    mid_index = (end -start)//2+start
    if start <= end:
        if l[mid_index] < aim:
            return find(l,aim,start = mid_index+1,end = end)
        elif l[mid_index] > aim:
            return find(l, aim, start=start, end=mid_index-1)

        else:
            return mid_index
    else:
        print('找不到')
l = [1,2,3,4,5,6,7,8,9]
t = find(l,5)
print(t)
# print(l.index(4))
升级版二分法

 8.菲波那切数列

我的自学Python之路(第二阶段Day9)
def fib(n):
    if n == 1 or n == 2:
        return 1

    return fib(n-1) + fib(n-2)


print(fib(50))
View Code

9.阶乘

我的自学Python之路(第二阶段Day9)
def func(n):
    if n == 1:
        return 1
    return n*func(n-1)
print(func(5))
View Code