# 函数基础
# 1.写函数,计算传入数字参数的和(动态传参)
# def sum_num(x,y):
# return x+y
# print(sum_num(1,2))
# 2.写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作
# def file(filename,parts):
# f = open(filename,'w+',encoding='utf-8')
# f.write(parts)
# f.close()
# file('staff',"abc")
# 3.写函数,检查用户传入的对象(字符串、列表、元祖)的每一个元素是否含有空内容
# def check(obj):
# for i in obj:
# if len(i.split(' ')) >= 2:
# print('%s内部元素%s有空内容'%(obj,i))
# check(['1 ','2'])
#4.写函数,检查传入字典的每一个value的长度,如果大于2,那么保留前两个长度的内容,并将新内容返回给调用者
# dic = {'k1':'v1v1','k2':[11,22,33,44]}
# # PS:字典中的value只能是字符串或列表
# for k,v in dic.items():
# if len(v)>2:
# dic[k] = v[0:2]
# print(dic)
# 5.解释闭包的概念
# 闭包:关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数)。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量
# 参数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。也就是说,内部函数会在外部函数返回后被执行。
# 而当这个内部函数执行时,它仍然必须访问其外部函数的局部变量、参数以及其他内部函数。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值
# 但是也会受外部函数的影响
# -------------------------------------------------------------------------------------------------------------------------------
#写函数,检查传入字典的每一个value的长度,如果大于2,那么保留前两个长度的内容,并将新内容返回给调用者
# dic = {'k1':'v1v1','k2':[11,22,33,44]}
# # PS:字典中的value只能是字符串或列表
# for k,v in dic.items():
# if len(v)>2:
# dic[k] = v[0:2]
# print(dic)
# 5.解释闭包的概念
# 闭包:关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数)。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量
# 参数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。也就是说,内部函数会在外部函数返回后被执行。
# 而当这个内部函数执行时,它仍然必须访问其外部函数的局部变量、参数以及其他内部函数。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值
# 但是也会受外部函数的影响
# -------------------------------------------------------------------------------------------------------------------------------
# 函数进阶
# 1.写函数,返回一个扑克牌列表,里面有52项,每一项是一个元祖i,例如:[('红心',2),('草花',2),...('黑桃A')]
# def poke ():
# poke_1 = ['红心','草花','黑桃','方片']
# poke_num = [2,3,4,5,6,7,8,9,10]
# poke_dig = ['A','K','J','Q']
# poke_special = ['JOKER1','JOKER2']
# poke_l1 = []
# for i in poke_1:
# for l in poke_num:
# poke_tuple =(i,l)
# poke_l1.append(poke_tuple)
# for j in poke_1:
# for k in poke_dig:
# poke_tuple_2 = tuple((j+k).strip().split(','))
# poke_l1.append(poke_tuple_2)
# for m in poke_special:
# poke_l1.append(tuple(m.strip().split(',')))
# print(poke_l1)
# poke()
# -------------Low版-------------------------
# def cards():
# num = []
# for i in range(2,11):
# num.append(i)
# num.extend(['J','Q','K','A'])
# type = ['红心','草花','方块','黑桃']
# result = []
# for i in num:
# for j in type:
# result.append((j,i))
# return result
# print(cards())
# -------------高级版-但是有bug('黑桃', 'A')!=('黑桃A')-----------
# 2.写函数,传入n个数,返回字典{'max':最大值,'min':最小值}
# def foo(*args):
# dic = {'max':None,'min': None}
# dic['max'] = max(args)
# dic['min'] = min(args)
# return dic
# print(foo(1,2,3,5,7,3,2,10))
# 3.写函数,专门计算图形的面积
# 其中嵌套函数,计算圆的面积,正方形的面积和长方形的面积
# 调用函数area(‘圆形’,圆半径) 返回圆的面积
# 调用函数area(‘正方形’,边长) 返回正方形的面积
# 调用函数area(‘长方形’,长,宽) 返回长方形的面积
# def area():
# import math
# def round_area():
# rad = int(input('请输入半径>>'))
# area_round = math.pi*rad*rad
# print('圆形面积是'+str(area_round))
# def square_area():
# side = int(input('请输入边长>>'))
# area_square = side*side
# print('正方形的面积是'+str(area_square))
# def rectangle_area():
# length = int(input('请输入长'))
# width = int(input('请输入宽'))
# area_rectangle = length*width
# print('长方形的面积是'+str(area_rectangle))
# area_choice = input('请选择需要计算的图形\n1.圆形\n2.正方形\n3.长方形')
# if area_choice == '1':
# round_area()
# elif area_choice =='2':
# square_area()
# elif area_choice =='3':
# rectangle_area()
# else:
# print('错误的命令!')
# area()
# 4.写函数,传入一个参数n,返回n的阶乘
# def cal(x):
# sum = 1
# for i in range(1,x+1):
# sum = sum*i
# print(sum)
# cal(10)
# 5.编写装饰器,为多个函数加上认证功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
# def wapper(func):
# def inner(*args,**kwargs):
# import json
# status = False
# if status ==True:
# res = func(*args, **kwargs)
# return res
# else:
# i = 0
# while i<3:
# with open('user_info', 'r', encoding='utf-8') as f:
# info = json.load(f)
# user = [i for i in info]
# username = input('请输入用户名>>>').strip()
# password = input('请输入密码>>>').strip()
# if username in user and info[username] ==password:
# print('登陆成功')
# status = True
# res = func(*args, **kwargs)
# return res
# else:
# print('登录失败,请重试')
# i += 1
# return inner
# @wapper
# def login():
# print('欢迎登陆!')
# @wapper
# def logout():
# print('登出!')
#
# login()
# logout()
# ---------------------------------------
# 生成器和迭代器
# 1.生成器和迭代器的区别?
# 生成器都是迭代器,都是列表、字典、字符串虽然都是迭代对象,但是都不是迭代器,因为不能使用next()方法,但是可以使用iter()函数将它们变成迭代器
# 迭代器就是一个数据流,生成迭代器的时候不需要规定终止点,没有终止也不需要终止条件,这样的就表示为数据流。
# 这是因为Python的Iterator对象表示的是一个数据流,iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出错误,可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个序列,所以Iterator的计算是惰性的,只有在需要返回下一个数据时才回去计算。
# 总结:
# 凡是可以作用for循环的对象都是Iterator类型;
# 生成器一定是迭代器,迭代器不一定是生成器(可以自己写对象)
# 2.生成器有几种方式获取value?
# 1.for循环
# 2.next()
# 3.__next__()
# 3.通过生成器写一个日志调用方法,支持以下功能
# 根据指令向屏幕输出日志
# 根据指令向文件输出日志
# 根据指令同时向文件&屏幕输出日志
# 以上日志格式如下
# 2017-10-19 22:07:38 [1] test log db backup 3
# 2017-10-19 22:07:40 [2] user alex login success
# #注意:其中[1],[2]是指自日志方法第几次调用,每调用一次输出一条日志
# 代码结构如下:
# def logger(filename, channel='file'):
# """
# 日志方法
# :param filename: log filename
# :param channel: 输出的目的地,屏幕(terminal),文件(file),屏幕+文件(both)
# :return:
# """
# pass
#
# # # 调用
# #
# #
# # log_obj = logger(filename="web.log", channel='both')
# # log_obj.__next__()
# # log_obj.send('user alex login success')
import datetime
count = 0 def logger(filename, channel):
global count
while True:
count += 1 # 日志方法第几次调用
mes = yield # 接收消息
info = '%s [%s] %s'% (datetime.datetime.now(), count, mes) def file(): # 输出到文件
with open(filename, "a", encoding="utf-8") as f:
f.write("\n%s" % info) def terminal(): # 输出到终端
print(info) if channel == "file": # 输出到文件
file()
elif channel == "terminal": # 输出到终端
terminal()
elif channel == "both": # 都输出
file()
terminal()
log_obj = logger(filename="test_file", channel='both')
log_obj.__next__()
log_obj.send('user alex login success') # 发送消息
log_obj.send('test log db backup 3')

# 内置函数
# 1,用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb
# name=['alex','wupeiqi','yuanhao','nezha']
# def change(x):
# return x+'_sb'
# res = map(change,name)
# print(list(res))
# 2,用filter函数处理数字列表,将列表中所有的偶数筛选出来
# num = [1,3,5,6,7,8]
# def func(x):
# if x % 2 == 0:
# return x
# print(list(filter(func,num)))
# 3,如下,每个小字典的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}
# ]
# 计算购买每支股票的总价
#   用filter过滤出,单价大于100的股票有哪些
# def sum():
# for i in portfolio:
# print(i['name'],i['shares']*i['price'])
# f = filter(lambda d:d['price']>=100,portfolio)
# print(list(f))

路飞学城Python-Day12(practise)的更多相关文章

  1. 路飞学城—Python爬虫实战密训班 第三章

    路飞学城—Python爬虫实战密训班 第三章 一.scrapy-redis插件实现简单分布式爬虫 scrapy-redis插件用于将scrapy和redis结合实现简单分布式爬虫: - 定义调度器 - ...

  2. 路飞学城—Python爬虫实战密训班 第二章

    路飞学城—Python爬虫实战密训班 第二章 一.Selenium基础 Selenium是一个第三方模块,可以完全模拟用户在浏览器上操作(相当于在浏览器上点点点). 1.安装 - pip instal ...

  3. 路飞学城Python爬虫课第一章笔记

    前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 之前看阮一峰的博客文章,介绍到路飞学城爬虫课程限免,看了眼内容还不错,就兴冲冲报了名,99块钱满足以下条件会返还并送书送视频. 缴 ...

  4. 路飞学城-Python开发集训-第3章

    学习心得: 通过这一章的作业,使我对正则表达式的使用直接提升了一个level,虽然作业完成的不怎么样,重复代码有点多,但是收获还是非常大的,有点找到写代码的感觉了,遗憾的是,这次作业交过,这次集训就结 ...

  5. 路飞学城-Python开发集训-第1章

    学习体会: 在参加这次集训之前我自己学过一段时间的Python,看过老男孩的免费视频,自我感觉还行,老师写的代码基本上都能看懂,但是实际呢?....今天是集训第一次交作业的时间,突然发现看似简单升级需 ...

  6. 路飞学城-Python开发集训-第4章

    学习心得: 学习笔记: 在python中一个py文件就是一个模块 模块好处: 1.提高可维护性 2.可重用 3.避免函数名和变量名冲突 模块分为三种: 1.内置标准模块(标准库),查看所有自带和第三方 ...

  7. 路飞学城-Python开发集训-第2章

    学习心得: 这章对编码的讲解超级赞,现在对于编码终于有一点认知了,但还没有大彻大悟,还需要更加细心的琢磨一下Alex博客和视频,以前真的是被编码折磨死了,因为编码的问题而浪费的时间很多很多,现在终于感 ...

  8. 路飞学城Python-Day19(practise)

    # 特性1.继承:2.多态:3.封装 # 1.继承的用处:通过继承就可以解决类与类之间的代码冗余关系 # 2.多态的用处:1.增加了程序的灵活性,以不变应万变,使用者都是同一种形式去调用(func(a ...

  9. 路飞学城-Python开发-第二章

    ''' 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家' ...

  10. 路飞学城-Python开发-第三章

    # 数据结构: # goods = [ # {"name": "电脑", "price": 1999}, # {"name&quo ...

随机推荐

  1. ScSPM & LLC

    为啥会有SPM→ScSPM呢?原因之一是为了寻找better coding + better pooling的方式提高性能,原因之二就是提高速度.如何提高速度?这里的速度,不是Coding+Pooli ...

  2. 使用css选择器来定位元素

    public void CSS(){ driver.get(Constant.baidu_url); //绝对路径 // driver.findElement(By.cssSelector(" ...

  3. ZBrush中Magnify膨胀笔刷介绍

    Magnify膨胀笔刷是ZBrush®笔刷中经常使用的,利用该笔刷可绘制中心向四周膨胀的效果.本文内容向大家介绍ZBrush®中膨胀笔刷以便大家熟悉它的用法和特性. Magnify膨胀笔刷 Magni ...

  4. BZOJ2179: FFT快速傅立叶 FFT实现高精度乘法

    Code: #include <cstdio> #include <algorithm> #include <cmath> #include <cstring ...

  5. node——模块分类,require执行顺序,require注意事项,原理

    node.js模块 在node.js开发中一个文件就可以认为是一个模块. 一.node.js模块分类 核心模块Code Module.内置模块.原生模块 fs http path url ... 所有 ...

  6. 安装SSH、配置SSH无密码登录 ssh localhost

    集群.单节点模式都需要用到 SSH 登陆(类似于远程登陆,你可以登录某台 Linux 主机,并且在上面运行命令),Ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server ...

  7. js-DOM操作基本知识

  8. tomcat使用及原理

    1,Tomcat作为Servlet容器的基本功能 2,Tomcat的组成结构 Tomcat本身由一列的可配置的组件构成,其中核心组件是Servlet容器组件,它是所有其他Tomcat组件的顶层容器.T ...

  9. 笔试中java的输入输出

    一,输入 import java.util.*; import java.io.*; public class Main { public static void main(String[] args ...

  10. C/C++ 浮点数比较问题

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50255623 Never try to ...