python编程小结_python编程知识小结

整理_Python工程目录.txt:

python的工程目录(名字是固定的,参考了Java中的工程目录名字):

1. 目录resource:放需要使用到的数据(该数据是永远不变的),比如输入的地图数据等。

2. 目录tmp:放变化的数据,比如某些数据1个月更新一次的,就放在tmp目录下

3. 目录pipeline:放一些流程化、衔接的工具,比如api_server、与前端对接的代码等。

4. 目录datadao:处理数据的代码包

5. 目录common:放置一些写死的常数,比如一些路径常数,比如common包下面的constant.py中,可以写:

import os

from trafficgo_nash.utils.config import CONF

SMALL_ROOT = os.path.abspath("./")

if CONF.dev == "offline":

SCC_CONF = "/opt/trafficgo/scc_yao/conf/scc.conf"

WCC_CONF = SMALL_ROOT + \

"/TrafficgoLite/" \

"lib/trafficgo-common-wcc-crypt-1.0.jar"

else:

SCC_CONF = "/opt/trafficgo/scc/conf/scc.conf"

WCC_CONF = os.path.abspath("./") + "/trafficgo-common-wcc-crypt-1.0.jar"

6. 目录utils(每次跑代码都会调用到):服务于全局的工具py,每次跑代码的时候都会调用到

7. 目录tools:一些工具类py,但不是每次跑代码都用到;比如我们每个月只划分一次子区,那么我们在划分子区时用到的代码就放在tools包下面,即该工具代码一个月才运行一次!

P.S. 我们可以从上述固定工程目录中,根据自己的需求进行选择!

python的工程目录(名字是自己设计的):

1. 目录control:控制代码,整个代码的核心主体,这个名字不是固定的,也可以叫目录algo,都可以!

2. 目录rules_service:规则引擎,根据设计的规则对控制量进行约束

3. 目录region_plan:计算信控区域方案下的相位差

4. 目录sumo_env:sumo仿真器的环境

...

然后我们在最外部写一个main.py,是整个程序的入口!

P.S. 如果某个功能我们在当前情况下,不使用,但是以后会使用到,那么我们可以给这个功能设置一个标志位,如果标志位为True,则启用,否则不使用。

通常,我们会将这个标志位添加到配置项config.py中,便于直接从外部修改它的值!而不是将这个标志位设置在该功能代码内部,这样不便于使用者修改它的值!

整理python__函数参数__有默认值的写法(学会用kwargs).txt:

函数入参,有默认值的写法(以下两种写法都可以):

写法1:

def test_1(inference_date = None):

if inference_date is not None:

print(inference_date)

else:

print("Please input the inference date!")

test_1(inference_date="2020-07-27")

写法2:对于入参不确定的情况,要学会写kwargs(kwargs是个dict)

def test_1(**kwargs):

test_date = kwargs.get("inference_date")

if test_date is not None:

print(test_date)

else:

print("Please input the inference date!")

test_1(inference_date="2020-07-27")

还有PEP8的推荐写法:

def complex(real, imag=0.0):

return magic(r=real, i=imag)

以下写法不推荐!:

>>> def foo(bar=[]): # bar is optional and defaults to [] if not specified

...    bar.append("baz") # but this line could be problematic, as we'll see...

...    return bar

在上面这段代码里,一旦重复调用foo()函数(没有指定一个bar参数),那么将一直返回'bar'。因为没有指定参数,那么foo()每次被调用的时候,都会赋予[]。下面来看看,这样做的结果:

>>> foo()

["baz"]

>>> foo()

["baz", "baz"]

>>> foo()

["baz", "baz", "baz"]

参考:

http://3ms.huawei.com/km/groups/3685627/blogs/details/7975331

整理__python单例.txt:

Python单例:在全局该类只有1个实例;

把类设置为单例,那么第一次调用这个类后,已经计算好的属性就存成了静态变量,后面调用该属性就直接用了,不用重复计算了。如果后面再调用的时候,某个属性没被计算过,那么就会进行计算,然后存成静态变量。

设置成单例的方法:适用于这个类需要被频繁调用(并且每次的计算开销比较大),这样就不用重复计算了,直接取所需的属性即可。用单例可以提高效率!

P.S. 如果某个属性被修改后,那么在全局这个类属性就都变成了新的值!

参考:https://zhuanlan.zhihu.com/p/88400968

https://zhuanlan.zhihu.com/p/60269982

单例代码示例:

import threading

def synchronized(func):

func.__lock__ = threading.RLock()

def lock_func(*args, **kwargs):

with func.__lock__:

return func(*args, **kwargs)

return lock_func

class Singleton(type):

_instances = {}

@synchronized

def __call__(cls, *args, **kwargs):

if cls not in cls._instances:

cls._instances[cls] = super(

Singleton, cls).__call__(

*args, **kwargs)

return cls._instances[cls]

import random

class A(object, metaclass=Singleton):

def __init__(self):

self.a = random.random()

a = A()

b = A()

print(id(a))  # 139910027848784

print(id(b))  # 139910027848784  即这两个实例对象的地址是一样的!

print(a.a)    # 0.6519248674842676

b.a += 1

print(b.a)    # 1.6519248674842677

print(a.a)    # 1.6519248674842677  即属性被改变后,全局都改变了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值