今天学习内容如下:

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.复习进度条

 

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.内置函数

# 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
# 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

 

# 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.匿名函数

 

# 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.练习题

# 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函数做了什么,就是在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归

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

def story():
    print('sdf')
    story()
story()
View Code

递归的最大深度——997

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

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

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
# 代码实现
# 二分查找算法 必须处理有序的列表
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)
简单版二分法
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.菲波那切数列

def fib(n):
    if n == 1 or n == 2:
        return 1

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


print(fib(50))
View Code

9.阶乘

def func(n):
    if n == 1:
        return 1
    return n*func(n-1)
print(func(5))
View Code

 

posted on 2018-06-27 19:09  快叫洪哥  阅读(282)  评论(0编辑  收藏  举报