python杂记

2021-02-26  本文已影响0人  Sl0wDive

一种设定全局参数的方法
import argparse

之后def个 get param的函数 或者不定义函数也行
def get_param():
parser = argparse.ArgumentParser(description='help info') #这里应该随便写
parser.add_argument('--lr',default=0.1,type=float)
parser.add_argument('--num_epochs',default=5,type=int)
parser.add_argument('--batch_size',default=512,type=int)
args = parser.parse_args()
之后调用的时候就
args = get_param()
lr = args.lr
num_epochs = args.num_epochs
batch_size = args.batch_size


python class类

首先注意 定义class 时 定义的名字 首字母大写 不带括号 但带冒号
但凡def的时候 括号内第一个写self
可以(也可以不def init
def init(self,a,b,c):
self.a = ..
self.b = ..
self.c = ..
联想到做算法题时 会用到这个 就是a b c参数可以在下面的程序中用到


python 变量四种作用域 以及 global 关键字

L : local 局部作用域
举例:

def f():
    x = 2
    return x  
x属于L

E : enclosing 嵌套的父级函数的 局部作用域
举例:

def f1():
    x = 5
    def f2():
        print(x)
    return f2  
x属于E 可以理解为x不仅作用于f2 还作用于f2之上的f1 范围更大一点

G : global 全局变量 就是模块级别定义的变量
举例:

x = 22
def f():
    x = 2
    return x 
print(x) > 22 : x属于G 即全局的变量 不在函数的内部

B : built-in 系统固定模块里面的变量
B在程序中 很少见 也管不了
四者的执行顺序是 L E G B 即由内而外

为什么需要global关键字:
看以下的程序:

x = 5
def add():
    x = x + 1
    return x

这样执行肯定报错 因为函数中的x没有定义
所以

x = 5
def add():
    global x 
    x = x + 1
    return x

这样就能正常运行
不过话说 上面的那个例子 括号里传递 x 参数就解决了。。
这个global只能用在函数中啊
像是 下面这种运行会出错。。

x = 5
global x 
def add():
    x = x + 1
    return x

if name == 'main'

https://www.zhihu.com/search?type=content&q=python%20name%20main
我理解的是 不会出大问题 别人不会跑不通
因为有些情况 自己写的一份python会作为一个模块 在其他py文件中进行调用
假如我写了一份文件 qkx.py

如果不带 if name main 的话 
import qkx  此时__name__的值是qkx   print(__name__) > qkx
如果不带 if name main 的话 
import qkx  此时__name__的值还是__main__  print(__name__) > __main__

__name__这个东西暂且不管 貌似python中一直存在  且可以打印出来 print(__name__)

python与mysql的交互

参考
https://zhuanlan.zhihu.com/p/84504148?utm_source=wechat_session&utm_medium=social&utm_oi=638746686156181504&utm_campaign=shareopn


使用logging模块代替print

首先 logging模块有5个level
分别是 debug info warn error critical

debug:查看程序运行的信息
info:查看程序是否如预料执行的信息
warn:意料之外的,但不影响程序运行
error和critical:一些比较严重的问题

import logging 
logging.basicConfig(level=logging.DEBUG , format='%(asctime)s - %(message)s', datefmt='%d-%b-%y %H:%M:%S') 
注意 level参数调用时要大写
logging.debug("Hello")

一个完整的例子

import logging;

def loggingDemo():
    logging.info("You should see this info both in log file and cmd window");
    logging.warning("You should see this warning both in log file and cmd window");
    logging.error("You should see this error both in log file and cmd window");
    logging.debug("You should ONLY see this debug in log file");
    return;
    
def initLogging(logFilename):
    logging.basicConfig(
                    level    = logging.DEBUG,
                    format   = 'LINE %(lineno)-4d  %(levelname)-8s %(message)s',
                    datefmt  = '%m-%d %H:%M',
                    filename = logFilename,
                    filemode = 'w');
    # define a Handler which writes INFO messages or higher to the sys.stderr
    console = logging.StreamHandler();
    console.setLevel(logging.INFO);
    # set a format which is simpler for console use
    formatter = logging.Formatter('LINE %(lineno)-4d : %(levelname)-8s %(message)s');
    # tell the handler to use this format
    console.setFormatter(formatter);
    logging.getLogger('').addHandler(console);
 
if __name__=="__main__":
    logFilename = "qkx_logging_demo.log";
    initLogging(logFilename);
    loggingDemo();

python sys

sys.argv是获取运行python文件的时候命令行参数
有 qkx.py 文件如下:

import sys
a = sys.argv[0]
print(a)

返回 qkx.py

若是

import sys 
a = sys.argv[1]
print(a)

之后 若是在 cmd中 运行 qkx.py boy ,则会返回boy

这一点有啥用呢。。
可以在命令行里直接给参数,不需要打开脚本改,比较方便?

呃。还是不太明白实战中的最大作用 遇到再说吧


ipynb 转 py

jupyter nbconvert --to python qkx.ipynb
上一篇下一篇

猜你喜欢

热点阅读