Fork me on GitHub

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=22.关键字函数  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()) 

 

posted @ 2017-12-18 15:53  未凉残念浮生若梦  阅读(296)  评论(0编辑  收藏  举报