欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python實(shí)現(xiàn)關(guān)鍵路徑和七格圖計(jì)算詳解

 更新時間:2023年03月15日 09:14:21   作者:田辛 | 田豆芽  
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)關(guān)鍵路徑和七格圖計(jì)算,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下

關(guān)鍵路徑計(jì)算是項(xiàng)目管理中關(guān)于進(jìn)度管理的基本計(jì)算。 但是對于絕大多數(shù)同學(xué)來說, 關(guān)鍵路徑計(jì)算都只是對一些簡單情形的計(jì)算。

今天,田老師根據(jù)以往的經(jīng)驗(yàn),用Python實(shí)現(xiàn)了在相對較復(fù)雜的情形下:

1.關(guān)鍵路徑計(jì)算

2.七格圖計(jì)算,包括

  • 最早結(jié)束時間EFT
  • 最晚開始時間LST
  • 最晚結(jié)束時間LFT
  • 總浮動時間TF
  • 自由浮動時間FF

3.緊前關(guān)系繪圖法(AON)

并且, 將輸出結(jié)果保存為網(wǎng)頁。 而且在網(wǎng)頁底部附上了完整的計(jì)算過程。

這個Python程序的實(shí)現(xiàn),可以幫助項(xiàng)目管理者更加方便地進(jìn)行關(guān)鍵路徑計(jì)算和進(jìn)度管理。同時,通過輸出結(jié)果保存為網(wǎng)頁的形式,也可以方便地與團(tuán)隊(duì)成員進(jìn)行共享和交流。

1.主程序

主程序主要實(shí)現(xiàn)了一個Project類,其中包含了計(jì)算關(guān)鍵路徑和七格圖的方法。具體實(shí)現(xiàn)方式如下:

1.  定義了一個Activity類,包含了活動的id、名稱、持續(xù)時間和緊前任務(wù)列表等屬性。 

2.  定義了一個Project類,包含了活動列表、項(xiàng)目持續(xù)時間、日志等屬性,以及計(jì)算關(guān)鍵路徑、計(jì)算七格圖、計(jì)算總浮動時間、計(jì)算自由浮動時間等方法。

3.  從JSON文件中讀取活動信息,并創(chuàng)建Project對象并添加活動。

4.  調(diào)用Project對象的calculate方法,計(jì)算每個活動的最早開始時間、最晚開始時間等數(shù)據(jù)。

5.  調(diào)用Project對象的calculate_critical_path方法,計(jì)算關(guān)鍵路徑。

6.  調(diào)用Project對象的calculate_project_duration方法,計(jì)算項(xiàng)目總工期。

7.  使用Jinja2模板引擎生成項(xiàng)目的活動清單,并將關(guān)鍵路徑

import json  
from datetime import datetime  
from typing import List  
  
import graphviz  
from jinja2 import Template  
  
from activity import Activity  
  
  
class Project:  
    def __init__(self):  
        self.activities: List[Activity] = []  
        self.duration = 0  
        self.logger = []  
  
    def log(self, log: str) -> None:  
        self.logger.append(log)  
  
    def add_activity(self, activity: Activity) -> None:  
        """  
        添加一個活動到項(xiàng)目中  
        :param  
        activity: 待添加的活動  
        """        # 將活動添加到項(xiàng)目中  
        self.activities.append(activity)  
  
    def calculate(self) -> None:  
        """ 計(jì)算整個項(xiàng)目的關(guān)鍵信息  
        :return: None  
        """        self.calculate_successor()  
        self._calculate_forward_pass()  # 計(jì)算正推法  
        self._calculate_backward_pass()  # 計(jì)算倒推法  
        self._calculate_total_floats()  # 計(jì)算總浮動時間  
        self._calculate_free_floats()  # 計(jì)算自由浮動時間  
  
    def calculate_successor(self) -> None:  
        self.log("開始計(jì)算緊后活動")  
        for act in self.activities:  
            for pred in act.predecessors:  
                for act_inner in self.activities:  
                    if act_inner.id == pred:  
                        act_inner.successors.append(act.id)  
  
    def _calculate_forward_pass(self) -> None:  
        self.log("## 開始正推法計(jì)算")  
        # 進(jìn)入 while 循環(huán),只有當(dāng)所有活動的最早開始時間和最早完成時間都已經(jīng)計(jì)算出來時,才會退出循環(huán)  
        while not self._is_forward_pass_calculated():  
            # 遍歷每個活動  
            for activity in self.activities:  
                # 如果活動的最早開始時間已經(jīng)被計(jì)算過,則跳過  
                if activity.est is not None:  
                    continue  
                # 如果活動沒有前置活動, 則從1開始計(jì)算最早開始時間和最早結(jié)束時間  
                if not activity.predecessors:  
                    activity.est = 1  
                    activity.eft = activity.est + activity.duration - 1  
                    self.log(  
                        f"活動 {activity.name} 沒有緊前活動,設(shè)定最早開始時間為1, 并根據(jù)工期計(jì)算最早結(jié)束時間為{activity.eft}")  
                else:  
                    # 計(jì)算當(dāng)前活動的所有前置活動的最早完成時間  
                    predecessors_eft = [act.eft for act in self.activities if  
                                        act.id in activity.predecessors and act.eft is not None]  
                    # 如果當(dāng)前活動的所有前置活動的最早完成時間都已經(jīng)計(jì)算出來,則計(jì)算當(dāng)前活動的最早開始時間和最早完成時間  
                    if len(predecessors_eft) == len(activity.predecessors):  
                        activity.est = max(predecessors_eft) + 1  
                        activity.eft = activity.est + activity.duration - 1  
                        self.log(  
                            f"活動 {activity.name} 緊前活動已完成正推法計(jì)算, 開始日期按最早開始時間里面最大的," +  
                            f"設(shè)定為{activity.est}并根據(jù)工期計(jì)算最早結(jié)束時間為{activity.eft}")  
  
                        # 更新項(xiàng)目總持續(xù)時間為最大最早完成時間  
        self.duration = max([act.eft for act in self.activities])  
  
    def _calculate_backward_pass(self) -> None:  
        """ 計(jì)算倒推法  
        :return: None  
        """  
        self.log("## 開始倒推法計(jì)算")  # 輸出提示信息  
        # 進(jìn)入 while 循環(huán),只有當(dāng)所有活動的最晚開始時間和最晚完成時間都已經(jīng)計(jì)算出來時,才會退出循環(huán)  
        while not self._is_backward_pass_calculated():  
            # 遍歷每個活動  
            for act in reversed(self.activities):  
                # 如果活動的最晚開始時間已經(jīng)被計(jì)算過,則跳過  
                if act.lft is not None:  
                    continue  
                # 如果活動沒有后繼活動, 則從總持續(xù)時間開始計(jì)算最晚開始時間和最晚結(jié)束時間  
                if not act.successors:  
                    act.lft = self.duration  
                    act.lst = act.lft - act.duration + 1  
                    self.log(f"活動 {act.name} 沒有緊后活動,按照正推工期設(shè)定最晚結(jié)束時間為{act.lft}," +  
                             f"并根據(jù)工期計(jì)算最晚開始時間為{act.lst}")  
                else:  
                    # 計(jì)算當(dāng)前活動的所有后繼活動的最晚開始時間  
                    successors_lst = self._calculate_lst(act)  
                    # 如果當(dāng)前活動的所有后繼活動的最晚開始時間都已經(jīng)計(jì)算出來,則計(jì)算當(dāng)前活動的最晚開始時間和最晚完成時間  
                    if len(successors_lst) == len(act.successors):  
                        act.lft = min(successors_lst) - 1  
                        act.lst = act.lft - act.duration + 1  
                        self.log(f"活動 {act.name} 緊后活動計(jì)算完成,按照倒推工期設(shè)定最晚結(jié)束時間為{act.lft}," +  
                                 f"并根據(jù)工期計(jì)算最晚開始時間為{act.lst}")  
        # 更新項(xiàng)目總持續(xù)時間為最大最晚完成時間  
        self.duration = max([act.lft for act in self.activities])  
  
    def _calculate_lst(self, activity: Activity) -> List[int]:  
        """計(jì)算某一活動的所有最晚開始時間  
        :param activity: 活動對象  
        :return: 最晚開始時間列表  
        """        rst = []  # 初始化結(jié)果列表  
        for act in activity.successors:  # 遍歷該活動的后繼活動  
            for act2 in self.activities:  # 遍歷所有活動  
                if act2.id == act and act2.lst is not None:  # 如果找到了該后繼活動且其最晚開始時間不為空  
                    rst.append(act2.lst)  # 將最晚開始時間加入結(jié)果列表  
        return rst  # 返回結(jié)果列表  
  
    def _is_forward_pass_calculated(self) -> bool:  
        """ 判斷整個項(xiàng)目正推法計(jì)算已經(jīng)完成  
        :return: 若已計(jì)算正向傳遞則返回True,否則返回False  
        """  
        for act in self.activities:  # 遍歷所有活動  
            if act.est is None or act.eft is None:  # 如果該活動的最早開始時間或最早完成時間為空  
                return False  # 則返回False,表示還未計(jì)算正向傳遞  
        return True  # 如果所有活動的最早開始時間和最早完成時間都已計(jì)算,則返回True,表示已計(jì)算正向傳遞  
  
    def _is_backward_pass_calculated(self) -> bool:  
        """ 判斷整個項(xiàng)目倒推法計(jì)算已經(jīng)完成  
        :return: 若已計(jì)算倒推法則返回True,否則返回False  
        """        for act in self.activities:  # 遍歷所有活動  
            if act.lst is None or act.lft is None:  # 如果該活動的最晚開始時間或最晚完成時間為空  
                return False  # 則返回False,表示還未計(jì)算倒推法  
        return True  # 如果所有活動的最晚開始時間和最晚完成時間都已計(jì)算,則返回True,表示已計(jì)算倒推法  
  
    def _calculate_total_floats(self) -> None:  
        """ 計(jì)算所有活動的總浮動時間  
        :return: None  
         """  
        self.log(f"## 開始計(jì)算項(xiàng)目所有活動的總浮動時間")  
        for act in self.activities:  # 遍歷所有活動  
            if act.est is not None and act.lst is not None:  # 如果該活動的最早開始時間和最晚開始時間都已計(jì)算  
                act.tf = act.lst - act.est  # 則計(jì)算該活動的總浮動時間  
                self.log(f"計(jì)算{act.name}的總浮動時間" + f"最晚開始時間{act.lst} - 最早開始時間{act.est} = {act.tf}", )  
            else:  # 如果該活動的最早開始時間或最晚開始時間為空  
                act.tf = None  # 則將該活動的總浮動時間設(shè)為None  
  
    def _calculate_free_floats(self) -> None:  
        """ 計(jì)算所有活動的自由浮動時間  
        :return: None  
        """        self.log(f"## 開始計(jì)算項(xiàng)目所有活動的自由浮動時間")  # 輸出提示信息  
        for act in self.activities:  # 遍歷所有活動  
            if act.tf == 0:  # 如果該活動的總浮動時間為0  
                self.log(f"計(jì)算{act.name}的自由浮動時間" + f"因?yàn)閧act.name}的總浮動時間為0,自由浮動時間為0")  # 輸出提示信息  
                act.ff = 0  # 則將該活動的自由浮動時間設(shè)為0  
            elif act.tf > 0:  # 如果該活動的總浮動時間大于0  
                self.log(f"計(jì)算{act.name}的自由浮動時間")  # 輸出提示信息  
                self.log(f"- {act.name}的總浮動時間{act.tf} > 0,")  # 輸出提示信息  
                tmp = []  # 初始化臨時列表  
                for act2 in self.activities:  # 遍歷所有活動  
                    if act2.id in act.successors:  # 如果該活動是該活動的緊后活動  
                        self.log(f"- {act.name}的緊后活動{act2.name}的自由浮動動時間為{act2.tf}")  # 輸出提示信息  
                        tmp.append(act2.tf)  # 將該緊后活動的自由浮動時間加入臨時列表  
                if len(tmp) != 0:  # 如果臨時列表不為空  
                    act.ff = act.tf - max(tmp)  # 則計(jì)算該活動的自由浮動時間  
                    if act.ff < 0:  
                        act.ff = 0  
                    self.log(f"- 用活動自己的總浮動{act.tf}減去多個緊后活動總浮動的最大值{max(tmp)} = {act.ff}")  
                else:  # 如果臨時列表為空  
                    act.ff = act.tf  # 則將該活動的自由浮動時間設(shè)為總浮動時間  
  
    def calculate_critical_path(self) -> List[Activity]:  
        """ 計(jì)算整個項(xiàng)目的關(guān)鍵路徑  
        :return: 整個項(xiàng)目的關(guān)鍵路徑  
        """        ctc_path = []  # 初始化關(guān)鍵路徑列表  
        for act in self.activities:  # 遍歷所有活動  
            if act.tf == 0:  # 如果該活動的總浮動時間為0  
                ctc_path.append(act)  # 則將該活動加入關(guān)鍵路徑列表  
        return ctc_path  # 返回關(guān)鍵路徑列表  
  
    def calculate_project_duration(self) -> int:  
        """ 計(jì)算整個項(xiàng)目的持續(xù)時間  
        :return: 整個項(xiàng)目的持續(xù)時間  
        """        return max(activity.eft for activity in self.activities)  # 返回所有活動的最早完成時間中的最大值,即整個項(xiàng)目的持續(xù)時間  
  
  
# 從JSON文件中讀取活動信息  
with open('activities.json', 'r', encoding='utf-8') as f:  
    activities_data = json.load(f)  
  
# 創(chuàng)建Project對象并添加活動  
project = Project()  
for activity_data in activities_data:  
    activity = Activity(  
        activity_data['id'],  
        activity_data['name'],  
        activity_data['duration'],  
        activity_data['predecessors']  
    )    project.add_activity(activity)  
  
# 計(jì)算每個活動的最早開始時間、最晚開始時間等數(shù)據(jù)  
project.calculate()  
  
# 計(jì)算關(guān)鍵路徑和項(xiàng)目總工期  
critical_path = project.calculate_critical_path()  
project_duration = project.calculate_project_duration()  
  
# 生成項(xiàng)目的活動清單  
with open('template.html', 'r', encoding='utf-8') as f:  
    template = Template(f.read())  
html = template.render(  
    activities=project.activities,  
    critical_path=critical_path,  
    project_duration=project_duration,  
    log=project.logger  
)  
  
# 生成項(xiàng)目進(jìn)度網(wǎng)絡(luò)圖  
aon_graph = graphviz.Digraph(format='png', graph_attr={'rankdir': 'LR'})  
for activity in project.activities:  
    aon_graph.node(str(activity.id), activity.name)  
    for predecessor in activity.predecessors:  
        aon_graph.edge(str(predecessor), str(activity.id))  
  
timestamp = datetime.now().strftime('%Y%m%d%H%M%S')  
  
aon_filename = f"aon_{timestamp}"  
  
aon_graph.render(aon_filename)  
  
# 將項(xiàng)目進(jìn)度網(wǎng)絡(luò)圖插入到HTML文件中  
aon_image = f'<img src="{aon_filename}.png" alt="Precedence Diagramming Method: AON">'  
html = html.replace('<p>Precedence Diagramming Method: AON: <br/>[image]</p>',  
                    '<p>緊前關(guān)系繪圖法: AON: <br/>' + aon_image + '</p>')  
  
filename = datetime.now().strftime('%Y%m%d%H%M%S') + '.html'  
with open(filename, 'w', encoding='utf-8') as f:  
    f.write(html)

2.活動類

程序名:activity.py

class Activity:  
    """  
    活動類,用于表示項(xiàng)目中的一個活動。  
  
    Attributes:        id (int): 活動的唯一標(biāo)識符。  
        name (str): 活動的名稱。  
        duration (int): 活動的持續(xù)時間。  
        predecessors (List[int]): 活動的前置活動列表,存儲前置活動的id。  
        est (int): 活動的最早開始時間。  
        lst (int): 活動的最晚開始時間。  
        eft (int): 活動的最早完成時間。  
        lft (int): 活動的最晚完成時間。  
        tf (int): 活動的總浮動時間。  
        ff (int): 活動的自由浮動時間。  
        successors (List[int]): 活動的后繼活動列表,存儲后繼活動的Activity對象。  
    """  
    def __init__(self, id: int, name: str, duration: int, predecessors: List[int]):  
        """  
        初始化活動對象。  
  
        Args:            id (int): 活動的唯一標(biāo)識符。  
            name (str): 活動的名稱。  
            duration (int): 活動的持續(xù)時間。  
            predecessors (List[int]): 活動的前置活動列表,存儲前置活動的id。  
        """        self.id = id  
        self.name = name  
        self.duration = duration  
        self.predecessors = predecessors  
        self.est = None  
        self.lst = None  
        self.eft = None  
        self.lft = None  
        self.tf = None  
        self.ff = None  
        self.successors = []  
  
    def __str__(self):  
        return f"id: {self.id}, name: {self.name}, est: {self.est}, lst: {self.lst}, eft: {self.eft}, lft: {self.lft},"  
        + f"successors: {self.successors}"

3.任務(wù)列表JSON文件

文件名:activities.json

[  
  {    "id": 1,  
    "name": "A",  
    "duration": 2,  
    "predecessors": []  
  },  
  {  
    "id": 9,  
    "name": "A2",  
    "duration": 3,  
    "predecessors": []  
  },  
    {  
    "id": 10,  
    "name": "A3",  
    "duration": 2,  
    "predecessors": []  
  },  
  {  
    "id": 2,  
    "name": "B",  
    "duration": 3,  
    "predecessors": [  
      1,  
      9  
    ]  
  },  
  {  
    "id": 3,  
    "name": "C",  
    "duration": 4,  
    "predecessors": [  
      1  
    ]  
  },  
  {  
    "id": 4,  
    "name": "D",  
    "duration": 2,  
    "predecessors": [  
      2,10  
    ]  
  },  
  {  
    "id": 5,  
    "name": "E",  
    "duration": 3,  
    "predecessors": [  
      2  
    ]  
  },  
  {  
    "id": 6,  
    "name": "F",  
    "duration": 2,  
    "predecessors": [  
      3  
    ]  
  },  
  {  
    "id": 7,  
    "name": "G",  
    "duration": 3,  
    "predecessors": [  
      4,  
      5  
    ]  
  },  
  {  
    "id": 8,  
    "name": "H",  
    "duration": 2,  
    "predecessors": [  
      6,  
      7  
    ]  
  },  
  {  
    "id": 11,  
    "name": "H2",  
    "duration": 4,  
    "predecessors": [  
      6,  
      7  
    ]  
  }  
]

4.輸出模板文件

<!DOCTYPE html>  
<html>  
<head>  
    <meta charset="UTF-8">  
    <title>PMP關(guān)鍵路徑計(jì)算</title>  
    <style>        table {  
            border-collapse: collapse;  
            width: 100%;  
        }  
  
        th, td {  
            border: 1px solid black;  
            padding: 8px;  
            text-align: center;  
        }  
  
        th {  
            background-color: #4CAF50;  
            color: white;  
        }  
  
        .critical {  
            background-color: #ffcccc;  
        }  
    </style>  
</head>  
<body>  
<h1>活動清單</h1>  
<table>  
    <tr>  
        <th>ID</th>  
        <th>活動名</th>  
        <th>持續(xù)時間</th>  
        <th>緊前活動</th>  
        <th>緊后活動</th>  
        <th>最早開始時間EST</th>  
        <th>最早結(jié)束時間EFT</th>  
        <th>最晚開始時間LST</th>  
        <th>最晚結(jié)束時間LFT</th>  
        <th>總浮動時間TF</th>  
        <th>自由浮動時間FF</th>  
    </tr>  
    {% for activity in activities %}  
    <tr {% if activity in critical_path %}class="critical" {% endif %}>  
        <td>{{ activity.id }}</td>  
        <td>{{ activity.name }}</td>  
        <td>{{ activity.duration }}</td>  
        <td>            {% for predecessor in activity.predecessors %}  
            {% for act in activities %}  
            {% if act.id == predecessor %}  
            {{ act.name }}  
            {% endif %}  
            {% endfor %}  
            {% if not loop.last %}, {% endif %}  
            {% endfor %}  
        </td>  
        <td>            {% for successor in activity.successors %}  
            {% for act in activities %}  
  
            {% if act.id == successor %}  
            {{ act.name }}  
            {% endif %}  
            {% endfor %}  
            {% if not loop.last %}, {% endif %}  
            {% endfor %}  
        </td>  
        <td>{{ activity.est }}</td>  
        <td>{{ activity.eft }}</td>  
        <td>{{ activity.lst }}</td>  
        <td>{{ activity.lft }}</td>  
        <td>{{ activity.tf }}</td>  
        <td>{{ activity.ff }}</td>  
    </tr>  
    {% endfor %}  
</table>  
<p>關(guān)鍵路徑是: {% for activity in critical_path %}{{ activity.name }}{% if not loop.last %} -> {% endif %}{% endfor  
    %}</p>  
<p>項(xiàng)目總工期: {{ project_duration }}</p>  
<p>Precedence Diagramming Method: AON: <br/>[image]</p>  
<p>  
<table>  
    <tr>  
        <th>執(zhí)行過程</th>  
    </tr>  
    {% for i in log %}  
    <tr>  
        <td style="text-align: left">{{i}}</td>  
    </tr>  
    {% endfor %}  
</table>  
</p>  
</body>  
</html>

到此這篇關(guān)于Python實(shí)現(xiàn)關(guān)鍵路徑和七格圖計(jì)算詳解的文章就介紹到這了,更多相關(guān)Python關(guān)鍵路徑 七格圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python數(shù)據(jù)結(jié)構(gòu)之Array用法實(shí)例

    Python數(shù)據(jù)結(jié)構(gòu)之Array用法實(shí)例

    這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)之Array用法實(shí)例,較為詳細(xì)的講述了Array的常見用法,具有很好的參考借鑒價值,需要的朋友可以參考下
    2014-10-10
  • 在 Windows 下搭建高效的 django 開發(fā)環(huán)境的詳細(xì)教程

    在 Windows 下搭建高效的 django 開發(fā)環(huán)境的詳細(xì)教程

    這篇文章主要介紹了如何在 Windows 下搭建高效的 django 開發(fā)環(huán)境,本文通過一篇詳細(xì)教程實(shí)例代碼相結(jié)合給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 使用python將excel數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫過程詳解

    使用python將excel數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫過程詳解

    這篇文章主要介紹了使用python將excel數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • Python之用戶輸入的實(shí)例

    Python之用戶輸入的實(shí)例

    今天小編就為大家分享一篇Python之用戶輸入的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Django權(quán)限機(jī)制實(shí)現(xiàn)代碼詳解

    Django權(quán)限機(jī)制實(shí)現(xiàn)代碼詳解

    這篇文章主要介紹了Django權(quán)限機(jī)制實(shí)現(xiàn)代碼詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • 了解一下python內(nèi)建模塊collections

    了解一下python內(nèi)建模塊collections

    這篇文章主要介紹了Python內(nèi)建模塊——collections的相關(guān)資料,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-09-09
  • 對numpy和pandas中數(shù)組的合并和拆分詳解

    對numpy和pandas中數(shù)組的合并和拆分詳解

    下面小編就為大家分享一篇對numpy和pandas中數(shù)組的合并和拆分詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • python程序的打包分發(fā)示例詳解

    python程序的打包分發(fā)示例詳解

    這篇文章主要為大家介紹了python程序的打包分發(fā)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Django實(shí)現(xiàn)翻頁的示例代碼

    Django實(shí)現(xiàn)翻頁的示例代碼

    翻頁是經(jīng)常使用的功能,Django提供了翻頁器。用Django的Paginator類實(shí)現(xiàn),有需要了解Paginator類用法的朋友可參考。希望此文章對各位有所幫助
    2021-05-05
  • Python繪制燈籠的示例代碼

    Python繪制燈籠的示例代碼

    這篇文章主要為大家介紹了如何通過Python繪制一個燈籠,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定幫助,感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下
    2022-02-02

最新評論