metaX

V1

2022/09/05阅读:45主题:默认主题

翁恺 的 Python程序设计笔记

翁恺 的 Python程序设计笔记

函数是重用的程序段。它们允许你给一段语句命名一个名字,这是函数定义。

你可以在你的程序的任何地方使用这个名称运行这个语句块,这是函数调用。

内置函数不用定义,直接调用len("hello")

自定义函数语法格式:

def 函数名(参数表):

​ 函数体

可变对象和不可变对象当参数,效果可能是不同的 当实参是不可变对象时,形参值改变不会影响实参! 当实参是可变对象时,形参值改变可能会影响实参

命名空间和作用域

  1. 变量可被访问范围称为变量的作用域,也称为变量命名空间或变量名字空间。Python程序用命名空间区分不同空间的相同名字。
  2. Python解释器启动时建立一个全局命名空间,全局变量就放在这个空间,还建立内置命名空间(built-in namespace),记录所有标准常用名\标准函数名等.在全局命名空间中定义的变量是全局变量。
  3. 每一个函数定义自己的命名空间,函数内部定义的变量是局部变量。如果在一个函数中定义一个变量x,在另一个函数中也定义x变量,因为是在不同的命名空间,所以两者指代的是不同的变量。可以通过多种方式获取其他命名空间的变量。

局部命名空间、全局命名空间和内置命名空间的访问顺序。局部命名空间-->全局命名空间-->内置命名空间

函数调用自身的编程技巧称为递归。

递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要终止条件递归条件

书的内容按照这样的层次组织:单词、句子、段落以及章。 代码也有类似的自底向上的组织层次:数据类型类似于单词,语句类似于句子,函数类似于段落,模块类似于章。

文件读写

  • 计算机文件,是存储在某种长期存储设备上的一段数据流.所谓“长期存储设备”一般指磁盘、光盘、U盘等。其特点是所存信息可以长期、多次使用,不会因为断电而消失。
  • 计算机文件可分为两种:二进制致文件和文本文件。图形文件及文字处理程序等计算机程序都属于二进制文件。

文件读写的步骤:

  1. 打开文件
  2. 处理数据
  3. 关闭文件
textFile = open("7-1.txt""rt")  # 以文本方式打开
t = textFile.readline()
print(t)
textFile.close()
binFile = open("7-1.txt""rb")  # 以二进制方式打开
b = binFile.readline()
print(b)
binFile.close()
文件打开模式 含义
"r" 只读模式(默认)
"w" 覆盖写模式(不存在则新创建;存在则重写新内容)
"x" 创建写模式(不存在则新创建;存在则出错)
"a" 追加模式(不存在则新创建;存在则只追加内容)
"+" 与r/w/a/x一起使用,增加读写功能
"t" 文本类型
"b" 二进制文件

多行文件读写

  • 用readlines()读写多行文件

    f = open("score.txt")
    for line in f.readlines():
        print(line)  # 处理行
    f.close()

类和对象概念

class Students:  # 定义Students类
    uname = '浙江大学'

    def __init__(self, ino, iname):
        self.no = ino
        self.name = iname

    def getInfo(self):
        print('学校:', Students.uname, ',学号:', self.no, ',姓名:', self.name)

    s1 = Students('317000001''zjuzhang')  # 创建一个实例对象
    s1.getInfo()
    s = '浙江大学'  # 创建一个字符串对象s,等价于s = str('浙江大学')
    s.index("大学")

面向对象程序设计(Object Oriented Progamming,OOP):

  • 使用对象进行程序设计,实现代码复用设计复用,使得软件开发更高效方便

封装:

  • 将数据和对数据的操作组合起来构成类,类是一个不可分割的独立单位

  • 类中既要提供与外部联系的接口,同时又要尽可能隐藏类的实现细节。

  • Python类中成员分为变量(数据、属性)和方法(函数)。

    Python类中成员:

    • 变量(数据) 类变量 实例变量

    • 方法(函数)

      公有方法

      私有方法:方法名以两个下划线 ‘_’ 前缀

      类方法:@classmethod

      静态方法:@staticmethod

类变量与实例变量

  • 类变量是在类中所有方法之外定义的
  • 实例变量一般是指在构造方法_init_()中定义的,定义和使用时以self作为前缀
  • 特性:在主程序中(或类的外部),实例变量属于实例(对象),只能通过对象名访问;而类变量属于类,可以通过类名或对象名都可以访问。
class Car:
    price = 100000  # 定义类变量

    def __init__(self, c):
        self.color = c  # 定义实例变量

    car1 = Car("Red")  # 创建对象
    car2 = Car("Blue")
    print(car1.color, Car.price)  # 查看实例变量和类变量的值
    Car.price = 110000  # 修改类变量
    Car.name = 'QQ'  # 动态增加类变量
    car1.color = "Yellow"  # 修改实例变量
    print(car2.color, Car.price, Car.name)
    print(car1.color, car1.price, Cae.name)
  • 实例方法: 在类的方法中第一个参数如果为self,这种方法称为实例方法。实例方法对类的某个给定的实例进行操作,可以通过self显式地访问该实例。

  • 类方法:Python允许声明属于类本身的方法,即类方法.类方法不对特定实例进行操作,在类方法中不能访问对象的实例变量。类方法通过装饰器@classmethod来定义,第一个形式参数必须为类对象本身,通常为cls。

  • Python类的成员没有访问控制限制,这与其他面向对象程序设计语言不同。

私有成员与公有成员

  • 在Python中通常有一些约定,以下划线开头的方法名和变量名有特殊的含义,尤其是在类的定义中。
  • _xxx:受保护成员,不能用'from module import*'导入;
  • __xxx__:系统定义的特殊成员;
  • __xxx:私有成员,只有类内自己能访问,不能使用对象直接访问到这个成员。
class Car1:
    price = 300000  # 定义类变量

    def __init__(self, name):  # 构造方法
        self.__name = name  # 定义实例变量
        self.__color = ""  # 存储汽车颜色

    def setColor(self, color):  # 设置汽车的颜色
        self.__color = color

    def getName(self):
        print(self.__name, self.__color)


car1 = Car1("奥迪")
car1.setColor("黑色")
car1.getName()
print(car1.price)

# print(car1.__name,car1.__color) #报错,私有成员,只能类内访问,不能使用对象直接访问

继承:从一个通用类(父类),扩展到更多特定的类(子类)

class Car1:
    price = 300000  # 定义类变量

    def __init__(self, name):  # 构造方法
        self.__name = name  # 定义实例变量
        self.__color = ""  # 存储汽车颜色

    def setColor(self, color):  # 设置汽车的颜色
        self.__color = color

        
 class ECar(Car): #子类ECar继承父类Car
    def __init__(self,name):
        super().__init__(name) #初始化父类的属性
        self.battery_size = 300
        
    def getEcar(self):
        print("我是电动汽车" + self.name + "电瓶容量" + str(self.battery_size) + "公里")
        
        
# 程序从这里开始运行
my_tesla = ECar("特斯拉")
my_tesla.getEcar()

多态:子类的对象可以传递给需要父类类型的参数。一个方法可以被沿着继承链的几个类,运行时由Python决定调用哪个方法,这也称为“动态绑定”。

Web应用程序开发概述

  • Web应用程序是一种可以通过浏览器访问的应用程序,程序的最大好处是用户很容易访问应用程序,终端只需要有浏览器即可,不需要再安装其他软件。
  • 这种程序开发也称为APP开发
  • Web应用程序现在主要采用浏览器/服务器架构(Browser/Server,简称B/S),它能够很好地应用再广域网上,成为越来越多企业的选择。
from flask import Flask

app = Flask(__name__)


@app.route("/")
def hello():
    return "Hello world!\n 这是一个web应用程序"


if __name__ == "__main__":
    app.run()

Web应用框架Flask

  • Flask是一个使用Python编写的轻量级Web应用框架。其WSGI工具箱采用Werkzeug,模板引擎则使用Jinja2。Flask使用BSD授权。

Web应用程序的运行过程

  • 运行用Python编写的服务器程序

  • 用户在浏览器输入URL访问某个资源

  • Flask接受用户请求分析URL

  • 为这个URL找到对应的处理函数

  • 执行函数并生成响应,返回给浏览器

  • 浏览器接受并解析响应,将信息显示在页面上

多个URL对应同一个函数

  • 多个URL可对应一个函数,这样在浏览器种输入不同的URL返回结果是一样的

  • 在浏览器输入:http://127.0.0.1:5000或http://127.0.0.1:5000/hello,结果一样

    from flask import Flask  # 导入flask模块

    app = Flask(__name__)  # 创建flask对象app


    @app.route("/")  # 装饰器,定义目录"/"或"/hello"执行

    @app.route("/hello")

    def hello():  # 定义函数,遇到网址目录为"/"或"/hello"执行
        return "Hello World! 这是一个Web应用程序"  # 返回字符串


    if __name__ == "__main__":
        app.run()  # 运行程序

HTTP协议常用请求:

  • GET:从服务器程序获取信息
  • POST:通常用作服务器程序发送数据,一般用表单实现。POST请求可能会导致新的资源的建立和/或已有资源的修改。

浏览器和服务器程序交互

  • 浏览器和服务器程序交互可以通过get和post方法实现。

  • 在装饰器上可以加上http方法,常用的是get和post方法,缺省的是get方法。

  • @app.route("/") 就等同于@app.route("/", methods = ["get"] )

  • 如需要用两个方法,可写成:

    • @app.route("/",methods=["get","post"])
    • get和post是站在浏览器角度看的

    执行加法程序

    模板的使用:

    • 返回的HTML字符串可以放在一个HTML文件中,这个文件就是模板

    • 目录结构:

      • add.py

      • templates

      • ​ |-----index.html

      • ​ |-----result.html

    image-20220905163556060
Made with FlexClip

Dash 简介

  • Dash构建在flask,Plotly和React之上,非常合适再纯Python中,高度自定义的用户界面,构建数据可视化App。它特别适合使用Python进行数据分析的人。
  • Dash应用程序在Web浏览器中呈现,可以将应用程序部署到服务器,然后通过URL进行共享。由于Dash应用程序是在Web浏览器中进行查看,因此Dash本质上是跨平台的。
    • pip install dash
    • pip install dash_html_components
    • pip install dash_core_components
    • pip install dash_table

Dash 用户手册:https://dash.plotly.com/ 典型Dash App:https://dash-gallery.plotly.host/Portal/

Dash应用程序结构:

  • Dash应用程序由两部分组成。第一部分是应用程序的“布局”,描述了应用程序的外观。第二部分描述应用程序的交互性
  • Dash为一组丰富的基于Web的交互式组件提供了Python接口,不必编写Javascript程序。
  • Dash提供了一个简单的回调函数,用于将自定义数据分析代码绑定到Dash用户界面,实现高级交互。

布局-layout

  • 布局由一个组件树组成,html.Div和dcc.Graph
  • dash_html_components库为每一个HTML标签都提供一个组件。
  • children属性是特殊的。按照惯例,它始终都是第一个属性,这意味着你可以省略它.
  • dash_core_components描述了更搞级别的组件。这些组件是交互式的,并通过JavaScript、HTML和CSS等生 成。
  • import dash_core_components as dcc
  • dcc.Graph参数是用plotly产生的图表

Dash_html_components例子

import dash_html_components as html

html.Div([
 html.Div('Example Div',style ={'color':'blue','fontSize':14}),
    html.P('Example p',className='my-class',id ='my-p-element')],
 style = {'marginBottom':50,'marginTop':25})

That dash code will render this HTML markup

<div style="margin-bottom:50px;marginTop:25px;">
 
    <div style = "color:blue;font-size;14px">
  Example Div
</div>
    
    <p class="my-class"id="my-p-element">
        Example p
    </p>
</div>

Dash的一个例子

import dash
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
import plotly.express as px

dataset = pd.read_excel("gapminder.xlsx")
fig = px.scatter(dataset, x="income", y="life_exp", animation_frame="year",
                 animation_group="country", size="income", color="continent",
                 hover_name="country", log_x=True, size_max=45,
                 range_x=[500200000], range_y=[2590],
                 labels=dict(income="人均收入(PPP购买力标准)", life_eXp="人均寿命"))
app = dash.Dash(__name__)  # 创建Web应用程序,即App
app.layout = html.Div([
    html.H1(children='人均收入和人均寿命关系图', style={'textAlign''center'}),
    html.Div([dcc.Graph(figure=fig)])
])
app.run_server()
未命名 ‑ Made with FlexClip

Dash加入布局元素

import dash
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
import plotly.express as px

dataset = pd.read_excel("gapminder.xlsx")
fig = px.scatter(dataset, x="income", y="life_exp", animation_frame="year",
                 animation_group="country", size="income", color="continent",
                 hover_name="country", log_x=True, size_max=45,
                 range_x=[500200000], range_y=[2590],
                 labels=dict(income="人均收入(PPP购买力标准)", life_eXp="人均寿命"))
app = dash.Dash(__name__)  # 创建Web应用程序,即App
app.layout= html.Div([
html.H1(#第一行
children='人均收入和人均寿命关系图',
style="textAlign':'center','color':"#111111"}#黑色
),
html.Div(#第二行
#Column 1
html.Div([html.Br([]),html.Br([]), #空行
html.H6('使用的第三方模块:'),
html.P('Pandas--数据分析:'),
html.P('Dash--Web应用程序框架')],
className = "two columns"),
#Column 2
html.Div([dcc.Graph(figure=fig)],className ="ten
columns"
),
],className = "row")])
app.run_server()
server.run()

分类:

后端

标签:

Python

作者介绍

metaX
V1