# 一、python 基础
-
python 函数参数:
- 类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。
以下是调用函数时可使用的正式参数类型:
-
必备参数: 按顺序传入
-
关键字参数: 不用按顺序,必须有关键字(词典)
-
命名关键字参数
-
## 对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过`kw`检查。 def person(name, age, **kw): if 'city' in kw: # 有city参数 pass if 'job' in kw: # 有job参数 pass print('name:', name, 'age:', age, 'other:', kw) ## 如果要限制关键字参数的名字,就可以用命名关键字参数 def person(name, age, *, city, job): print(name, age, city, job) ##和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。 ## 如果函数定义中已经有了一个可变参数(不定长参数),后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:
-
-
命名关键字参数
-
默认参数:默认有值的参数
-
不定长参数:
5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
-
内建函数
-
类访问限制https://www.liaoxuefeng.com/wiki/1016959663602400/1017496679217440
- 静态语言不同,Python允许对实例变量绑定任何数据,也就是说,对于两个实例变量,虽然它们都是同一个类的不同实例,但拥有的变量名称都可能不同,绑定的数据属于成员变量、实例变量?该变量的生命周期如何?
- 私有变量: 把属性的名称前加上两个下划线
- 在Python中,变量名类似
__xxx__
的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__
、__score__
这样的变量名。
-
单下划线、双下划线、头尾双下划线说明:
- **__foo__**: 定义的是特殊方法,一般是系统定义名字 ,类似 init() 之类的。
- _foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
- __foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了
-
os.path.sep.join([“str1”,“str2”])
- os.path 获取路径,sep获取路径分隔符,分隔符调用join,连接字符串数组
- os.path.join(os.getcwd(), ‘ui/help/html/about.htm’)
-
decorator 装饰 [python函数修饰器(decorator)]
-
Python 内置函数 getattr() setattr()
-
import
import 模块名1 [as 别名1], 模块名2 [as 别名2],…
:使用这种语法格式的 import 语句,会导入指定模块中的所有成员(包括变量、函数、类等)。不仅如此,当需要使用模块中的成员时,需用该模块名(或别名)作为前缀,否则 Python 解释器会报错。from 模块名 import 成员名1 [as 别名1],成员名2 [as 别名2],…
: 使用这种语法格式的 import 语句,只会导入模块中指定的成员,而不是全部成员。同时,当程序中使用该成员时,无需附加任何前缀,直接使用成员名(或别名)即可。
注意,用 [] 括起来的部分,可以使用,也可以省略。
ImportError: 解决方法:
1, 相对路径中导入,搜索路径中添加 当前路径
import sys
print(sys.path)
2, 绝对路径导入
import_string = “import ide.ui.plugins.local_plugins.caseGenerator_template.parse_excel.caseGeneratorBase”
exec(import_string)
12, 删除文件、文件夹、非空文件夹
import os
import shutil
os.remove(path) #删除文件
os.removedirs(path) #删除空文件夹
os.rmdir(path) #删除空文件夹
shutil.rmtree(path) #递归删除文件夹,即:删除非空文件夹
13, mkdir makedir
14, os.path.join()
15, Python—执行系统命令的四种方法(os.system、os.popen、commands、subprocess)
16, 文档:https://docs.python.org/zh-cn/3/contents.html
17, classmethod https://www.cnblogs.com/baxianhua/p/10845620.html
18, 函数传参:值引用、引用、
def testFunc(self, dict_data):
dict_temp = dict_data
# testFunc(dict_data) 调用结束后,dict_data 会被清空吗?
re库
1,我们曾说过Python的代码最终会被编译为字节码,然后才被解释器执行。我们特别提到用调用eval()或exec()调用一个代码对象而不是一个字符串,在性能上会有明显的提升,这是因为对前者来说,编译过程不必执行。换句话说,使用预编译代码对象要比使用字符串快,因为解释器在执行字符串形式的代码前必须先把它编译成代码对象。
这个概念也适用于正则表达式,在模式匹配之前,正则表达式模式必须先被编译成regex对象。由于正则表达式在执行过程中被多次用于比较,我们强烈建议先对它做预编译,而且,既然正则表达式的编译是必须的,那使用么预先编译来提升执行性能无疑是明智之举。re.compile()就是用来提供此功能的。
其实模块函数会对已编译对象进行缓存,所以不是所有使用相同正则表达式模式的 search()和match()都需要编译。即使这样,你仍然节省了查询缓存,和用相同的字符串反复调用函数的性能开销。在Python1.5.2版本里,缓存区可以容纳20个已编译的正则表达式对象,而在1.6版本里,由于另外添加了对Unicode的支持,编译引擎的速度变慢了一些,所以缓存区被扩展到可以容纳100个已编译的regex对象
import re
pattern_condition_name = '^Condition\[\w+\]'#Condition[X]
pattern_check_name = '^Check\[\w+\]'
row_start, row_end, col_start, col_end = 0, 0, 0, 0
for row in ws.iter_rows(min_row=0, max_row=1, max_col=ws.max_column):
for col in range(ws.max_column):
if (row[col].value is None):
continue
print(row[col].value)
if (re.match(pattern_condition_name, row[col].value)):
col_start = col
elif (re.match(pattern_check_name, row[col].value)):
col_end = col
break
else:
# condition
continue
19, exec compile() 使用
https://wizardforcel.gitbohttps://wizardforcel.gitbooks.io/core-python-2e/content/16.htmloks.io/core-python-2e/content/16.html
20,
#!usr/bin/env python
-*- coding:utf-8-*-
21, C++ 静态方法、python 静态方法
C++:静态方法可以访问静态变量,非静态方法不能访问
OOP
1,init():实例化一个对象后,调用init方法,初始化一些实例变量
2,静态方法、类方法。
静态方法:@staticmethod
类方法:@classmethod
3, 13.12.3 hasattr()、getattr()、setattr()、delattr()
线程
threading
锁、重入锁
pytest
groovey jenkin
can
PyQT5
1, ref: https://maicss.gitbooks.io/pyqt5/content/hello_world.html
2, PyQt5学习笔记06----Qt Designer自定义信号emit及传参 信号与槽
class CIDEWindow(PyQt5.QtWidgets.QMainWindow):
statusMsgSignal = PyQt5.QtCore.pyqtSignal(str) ##新建一个信号,带一个参数,字符串类型
def __init__(self):
...
...
self.statusMsgSignal.connect(self.statusMsg) ## connect视为slot,绑定槽函数 statusMsg(参数与信号的参数类型一致,参数数量与信号相比,只能少不能多)
def statusMsg(self, msg):
self.statusBar.showMessage(msg)
self.updateCtrlAltFlag()
def ctrlAltRelease(self, key_name):
try:
if key_name == 'CTRL':
self.ctrl_alt_flag &= 1
self.statusMsgSignal.emit('Ctrl released !') ##释放信号,传入参数,触发槽函数
elif key_name == 'ALT':
self.ctrl_alt_flag &= 2
self.statusMsgSignal.emit('Alt released !')
else:
pass
except:
import traceback
print(traceback.print_exc())
3, clicked.connect 控件操作触发槽函数
4, pyqt5. 信号与槽 https://blog.csdn.net/jia666666/article/category/9278208
else:
pass
except:
import traceback
print(traceback.print_exc())
3, clicked.connect 控件操作触发槽函数
4, pyqt5. 信号与槽 <https://blog.csdn.net/jia666666/article/category/9278208>
1. pyqt5: <https://blog.csdn.net/jia666666/article/category/9278208>分类专栏