python之路day4_Python之路,Day4 - Python基础4

本节内容

迭代器&生成器

装饰器

Json & pickle 数据序列化

软件目录结构规范

作业:ATM项目开发

1.装饰器(语法糖)

定义:本质是函数,(装饰其他函数),就是为其他函数添加附加功能

原则:

不能修改被装饰函数的源代码

不能修改被装饰函数的调用方式

实现装饰器“知识”储备:

1.函数即“变量”

2.高阶函数

a.把一个函数名当作实参传给另一个函数(在不修改被装饰函数源代码的情况下为其添加功能)

def bar():

print("in the bar")

def test1(func): #test1(bar)

print(func)

func() #相当于bar()

test1(bar) #此时相当于 func=bar

--------输出--------

in the bar

1 importtime2 defbar():3 time.sleep(3)4 print("in the bar")5 defdeco(func):6 start_time=time.time()7 func()8 stop_time=time.time()9 print("the func run time is %s"%(stop_time-start_time))10 deco(bar) #但是其实这个例子不合适,因为改变了调用方式

11 #bar() 这才是原来的调用方式

12

13 ------输出-----

14 inthe bar15 the func run time is 3.0007259845733643

举例

b.返回值包含函数名(不修改函数调用方式)

1 defbar():2 print("in the bar")3 def deco(func): #func=bar

4 print(func) #打印bar的内存地址

5 return func #再返回bar的内存地址

6 #内存地址+()就能运行

7

8 deco(bar) #把内存地址即函数名传给deco

9 print("----分割线---")10 print(deco(bar)) #把return返回值打印出来

11 print("------||------")12 deco(bar()) #把返回值传给deco,不符合高阶函数的定义

13

14 ----------输出------

15

16 ----分割线---

17

18

19 ------||------

20 inthe bar21 None

View Code

因此,可以得到在不改变调用方式的情况下的做法

def bar():

print("in the bar")

def deco(func): #func=bar

print(func) #打印bar的内存地址

return func #再返回bar的内存地址

#内存地址+()就能运行

bar=deco(bar) #将return返回的值赋值给bar

bar() #此时bar为内存地址,所以bar+()就能运行bar这个函数

------输出-----

in the bar

3.嵌套函数

定义:在函数体内,用def去声明一个新的函数。而不是去调用他

def foo():

print("in the foo")

def bar():

print("in the bar/")

bar() #局部变量只能在局部函数内调用

foo()

‘‘‘

def foo():

bar() #这种是直接调用

‘‘‘

-------输出----

in the foo

in the bar/

4.高阶函数+嵌套函数==》装饰器

匿名函数

def plus(n): #函数名plus

return n+1

plus2 = lambda x:x+1 #没有函数名字,只有变量名

#但是两者得到的结果是一样的

#lambda x:x+1 起了个名字叫plus2,相当于def plus2(x)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Day17 中,我们可以通过 Flask 框架快速搭建一个 BBS 论坛。具体步骤如下: 1. 创建 Flask 应用 ```python from flask import Flask app = Flask(__name__) ``` 2. 创建数据库 ```python from flask_sqlalchemy import SQLAlchemy app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///bbs.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) ``` 3. 创建数据库模型 ```python class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(20), unique=True, nullable=False) password = db.Column(db.String(20), nullable=False) class Post(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(100), nullable=False) content = db.Column(db.Text, nullable=False) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) ``` 4. 创建路由和视图函数 ```python @app.route('/') def index(): posts = Post.query.all() return render_template('index.html', posts=posts) @app.route('/post/<int:post_id>') def post(post_id): post = Post.query.get(post_id) return render_template('post.html', post=post) @app.route('/new_post', methods=['GET', 'POST']) def new_post(): if request.method == 'POST': title = request.form['title'] content = request.form['content'] user_id = 1 # 假设当前用户为 id 为 1 的用户 post = Post(title=title, content=content, user_id=user_id) db.session.add(post) db.session.commit() return redirect('/') return render_template('new_post.html') @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] user = User.query.filter_by(username=username, password=password).first() if user: session['user_id'] = user.id return redirect('/') else: flash('用户名或密码错误') return render_template('login.html') @app.route('/logout') def logout(): session.pop('user_id', None) return redirect('/') ``` 5. 创建 HTML 模板 创建 index.html、post.html、new_post.html、login.html 四个模板文件,并且使用 jinja2 模板引擎渲染数据。 6. 运行应用 ```python if __name__ == '__main__': app.run() ``` 以上就是快速搭建 BBS 论坛的主要步骤,当然在实际应用中还需要考虑更多细节问题,比如用户认证、数据校验、页面美化等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值