Python学习笔记之函数与正则
Python函数
Pycharm 常用快捷键,例如复制当前行、删除当前行、批量注释、缩进、查找和替换。 常用快捷键的查询和配置:Keymap Ctrl + D:复制当前行 Ctrl + E:删除当前行 Shift + Enter:快速换行 Ctrl + /:快速注释(选中多行后可以批量注释) Tab:缩进当前行(选中多行后可以批量缩进) Shift + Tab:取消缩进(选中多行后可以批量取消缩进) Ctrl + F:查找 Ctrl + H:替换 ----------------------------------------------------------------- 是否为主文件:__name__ __name__就是标识模块的名字的一个系统变量 if __name__ == '__main__' 查看当前文件路径 __file__ print __file__ 查看当前文件路径 __doc__ print __doc__ 查看模块注释
1.__doc__ 返回指定函数的文档字符串(函数的注释) def doc_value(x): """两数相加""" return x+x ------------------------------- doc_value.__doc__ ------------------------------- print result is : "两数相加" 2.__name__ 返回函数名 def doc_value(x): ------------------------------- doc_value.__name__ ------------------------------- print result is: "doc_value" 3.__module__返回函数所在模块名字 def doc_value(x): ------------------------------- doc_value.__module__ ------------------------------- print result is: "__main__" maim 代表主函数 4.func_defaults 返回一个包含默认参数值的元祖 5.func_dicts 返回支持任意函数属性的命名空间 6.func_globals 返回一个包含函数全局变量的字典应用 7.func_closure 返回一个胞体元祖,其中胞体包含了函数自由变量的绑定 ********************************************** 函数调用函数 1.默认函数 :这允许用户为函数的参数定义一些默认值。 这种情况下,可以以更少的参数来调用该函数,而函数调用时未提供的参数,Python会使用默认提供的值作为这些参数值 def default(x=2) 2.关键字函数 key =value def dict_value(**x) dict_value(x=2) 3.任意的参数列表 ,可变函数 Python还支持定义这样的函数,该函数可以接受以元组形式传递的任意数量的参数 def list_value(*x) list_value(1,2,3,4,5) 当实参为list时也可以入多个值 def list_test(x) list_test([1,2,3,4]) 参数定义的顺序必须是:必选参数、默认参数、可变参数和关键字参数 def test(a, b=1, *c, **d)
yield 生成器,延迟生成 |保持函数的执行状态 xrange 生成器 python3取消 python3 range 放映列表对象range(1,10) --------------------------- 三元运算: result = 'gt' if 1 > 3 else 'lt' print(result) lambda 可以这样认为,lambda作为一个表达式,定义了一个匿名函数 非常容易理解,在这里lambda简化了函数定义的书写形式。是代码更为简洁,但是使用函数的定义方式更为直观,易理解。 lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值 --------------------------- 内置函数 help()帮助 dir() 返回模块的属性列表。 vars() 返回对象object的属性和属性值的字典对象 type() 查看参数是什么类型 ---------------------------- reload() 用于重新载入之前载入的模块 import test_demo.demo import imp imp.reload(test_demo.demo) id()查看变量内存地址 ---------------------------- 原cmp(x, y)用于比较2个对象 如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1 python3 摒弃 import operator #首先要导入运算符模块 operator.gt(1,2) #意思是greater than(大于) operator.ge(1,2) #意思是greater and equal(大于等于) operator.eq(1,2) #意思是equal(等于) operator.le(1,2) #意思是less and equal(小于等于) operator.lt(1,2) #意思是less than(小于) 返回布尔值 ---------------------------- abs() 绝对值 bool()布尔值 divmod() 返回商与余数的元组 用于网页分页 max() 最大值 min() 最小值 len() 长度 sum() 求和 all(可迭代对象) 遍历迭代对象,全部为真则为true,有一个为假则为假,空为True any(可迭代对象) 有一个不为flase,则返回true,空为flase chr()主要用来表示ascii码对应的字符他的输入时数字 ord()函数主要用来返回对应字符的ascii码 hex(x ) 将一个整数转换为一个十六进制字符串 oct(x ) 将一个整数转换为一个八进制字符串 bin() 返回一个整数 int 或者长整数 long int 的二进制表示 ----------------------------------------------- enumerate 对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值 list_value = [1, 2, 3, 4] for value in enumerate(list_value): print(value) (0, 1) (1, 2) (2, 3) (3, 4) print('{0}{1}{2}'.format('无敌', '的', '我')) ----------------------------------------------- 结果:无敌的我 apply(func [, args [, kwargs ]]) 函数用于当函数参数已经存在于一个元组或字典中时,间接地调用函数(python3已结不支持了) Python2详细用法: http://www.jb51.net/article/53044.htm map(function,list)是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。 print(list(map(lambda x: x*2, [1, 3, 5, 7, 9]))) filter(function,list)函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表 该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中 print(list(filter(lambda x: x % 2 == 0, [1, 2, 3, 4, 5]))) reduce(function,list[,可选参数])函数会对参数序列中元素进行累积。 函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给reduce中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作, 得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。 python3 reduce已经从全局名字空间移除了, from functools import reduce print(reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])) zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表 传N个列表,生成一个新的序列,让每一列是一组 list1 = [1, 2, 3] list2 = ['a', 'b', 'c'] list3 = ['hello', 'world', 'jack'] print(list(zip(list1, list2, list3))) [(1, 'a', 'hello'), (2, 'b', 'world'), (3, 'c', 'jack')] eval() 函数用来执行一个字符串表达式,并返回表达式的值 print(eval('8*8')) 64
反射:通过字符串的形式导入模块,并以字符串的形式执行函数 # 反射(模块) temp = 'os' model = __import__(temp) print(model.path.split(__file__)[0]) C:/Users/TDH/Desktop/TestKnow/Python/day03/test_01 实际: -------------------------------- 动态导入 切换不同数据库 mysql,sqlserver 用于随时切换数据库,减低程序耦合 getattr() 函数用于返回一个对象属性值。 在没有对应属性时,将触发 AttributeError # 反射(函数) model = __import__('demo1') function = getattr(model, 'print_hello') print(function)
import random print(random.random) #生成随机数,0-1之间 print(random.randint(1, 2)) #定义取数区间,去其中的一个整数 print(random.randrange(1, 3)) #大于等于1,小于3的数 # 6位验证码 import random code = [] for i in range(6): if i == random.randint(1, 5): code.append(str(random.randint(1, 5))) else: code.append(chr(random.randint(65, 90))) print(''.join(code))
# md5加密 import hashlib m2 = hashlib.md5() m2.update('admin'.encode('utf-8')) print(m2.hexdigest())
序列化/反序列化 将对象转换为可通过网络传输或可以存储到本地磁盘的数据格式(如:XML、JSON或特定格式的字节串)的过程称为序列化;反之,则称为反序列化。 Python的JSON模块 序列化与反序列化的过程分别叫做:encoding 和 decoding。 encoding: 把Python对象转换成JSON字符串 decoding: 把JSON字符串转换成python对象 import pickle li = ['a', '12', '2', '32'] print(pickle.dumps(li)) print(pickle.loads(pickle.dumps(li)))
参数名 | 解释 |
---|---|
obj | 要存入json文件的python对象 |
fp | 文件句柄 |
ensure_ascii | 设置为False的话才可以把中文以中文的形式存到文件里,否则会是’\xXX\xXX’这种 |
indent | 缩进的空格数,设置为非零值时,就起到了格式化的效果,比较美观 |
# 序列化到文件中 >>> with open('test.json', 'w') as fp: ... json.dump({'a':'str中国', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f': [1, 2, 3], 'g':(4, 5, 6)}, fp, indent=4) # 反序列化文件中的内容 >>> with open('test.json', 'r') as fp: ... json.load(fp) {'e': 10, 'g': [4, 5, 6], 'b': 11.1, 'c': True, 'd': None, 'a': 'str中国', 'f': [1, 2, 3]} 应用场景:Python与Python之间文件传输
Python正则表达式
正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法 ---------------------------------------------------- Python支持的正则表达式元字符和语法 ********************************* 字符 --------------------------------- .匹配除换行符\n之外的任意字符 \转义字符 [...] 字符集,对应的位置可以使字符集中任意字符 ********************************* 预定义字符集 --------------------------------- \d 数字[0-9] \D 非数字[^\d] \s 空白字符[<空格>\t\r\n\f\v] \S 非空白字符[^\s] \w 单词字符[A-Za-z0-9] \W 非单词字符[^\w] ********************************* 数量词 --------------------------------- * 匹配前一个字符0或无限次 + 匹配前一个字符1次或无限次 ? 匹配前一个字符0次或1次 {m} 匹配前一个字符m次 {m,n} 匹配前一个字符m至n次 *?+??非贪婪模式 ********************************* 边界匹配 --------------------------------- ^ 匹配字符串开头 $ 匹配字符串末尾 \A 仅匹配字符串开头 \Z 仅匹配字符串末尾 \b 匹配\w和\W之间 \B [^\b] ********************************* 逻辑、分组 --------------------------------- | 代表左右表达式任意匹配一个 (...) 被括起来的表达式将作为分组 (?P<name>...)分组,除了原有的编号外再指定一个额外的别名 \<number>引用编号为<number>的分组匹配到的字符串 (?P=name)应用别名为<name>的分组匹配的字符串 ********************************* 特殊构造 --------------------------------- (?..) (..)的部分组版本 (?iLmsux) iLmsux的每个字符代表一个匹配模式,只能用于正则表达式的开头 (?#...) #之后的内容将作为注释被忽略 (?=...) 之后的字符串内容需要匹配表达式才能匹配成功 (?!...) (?<=..) (?<!..) (?(id/name)yes-pattern|no-pattern) ********************************* ---------------------------------------------------- 贪婪模式与非贪婪模式 Python里数量词默认是贪婪的,总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符 例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb"。而如果使用非贪婪的数量词"ab*?",将找到"a" ---------------------------------------------------- match 只能从起始位置匹配 search 在整个字符串去匹配 findall函数返回的总是正则表达式在字符串中所有匹配结果的列表 re.compile()函数,将正则表达式的字符串形式编译为Pattern实例,然后使用Pattern实例处理文本并获得匹配结果(一个Match实例) groups 只获取组里的字符 group 匹配所有符合的正则的字符 ---------------------------------------------------- # 将正则表达式编译成Pattern对象 pattern = re.compile(r'world') # 使用search()查找匹配的子串,不存在能匹配的子串时将返回None # 这个例子中使用match()无法成功匹配 match = pattern.search('hello world!') print (match.group())