day5--<装饰器、模块、字符串格式化、生成器、迭代器>logging模块
本节大纲:
一:双层装饰器:
一个函数可以被多层装饰器进行装饰,函数渲染(编译)从下到上,函数执行从上到下。
如下程序:
#!/usr/bin/env python
#-*-coding:utf-8-*-
# author:liumeide # USERINOF={'islogin':True}
USERINOF={'user_type':'','islogin':True}
def login(func):
def inner_1(*args,**kwargs):
if USERINOF.get('islogin',None):
ret=func()
return ret
else:
print('login first!')
return inner_1
def check_user(func):
def inner(*args,**kwargs):
if USERINOF.get('islogin',None)==True and USERINOF.get('user_type',None)=='':
ret=func()
return ret
else:
print('permission deny!!')
return inner
@login
@check_user
def index():
print('index') index()
多层装饰器该如何理解呢?
上面的函数的可以执行顺序可以理解为:
首先:函数login、check_user、index加载到内存。在调用index函数的时候,执行index函数,因为index函数被check_user函数装饰,所以把check_user函数的内的inner函数体重新赋值给index,index函数体被当做
参数传入check_user函数。当满足inner函数的条件的时候被执行,新的函数index函数的函数体inner被login函数的所装饰,也就是说inner函数被重新赋值给inner_1函数。也就是说最后调用执行index()顺序:
先执行inner_1函数体----->在执行inner函数体-->在执行index原先的函数体。
多层装饰器以此类推,同样的原理。三层以上的装饰器很少使用。
二:字符串格式化:
%[(name)][flags][width].[precision]typecode
%号初始化字符串:
顺序传入参数。
执行名称传入参数
保留小数点后几位
当有占位符的时候 需要%%输出%如果没有占位符需要只写一个%在占位符的时候类似一个转义的意思。
1:
print('name:%s,age:%s'%('evil','')) name:evil,age:
普通字符串的初始化,需要传入的实参和占位符的个数保持一致。
(name):按名字进行取值。
2:可以根据占位的name的key,根据后面的字典对应的value进行传入来进行传入实参。
print("Name:%(name)s"%{'name':'ok'})
Name:ok
3: flags一般和width宽度来一起配合使用,如果单纯的使用flags并没什么效果。很少使用这个功能。
print("qqqq%(name)+s"%{'name':'ok'})
qqqqok
2个一起配合使用:+10表示右对齐,字符串ok占用10个字符。右对齐;正数前加正好,负数前加负号
print("qqqq%(name)+10s"%{'name':'ok'})
qqqq ok
-号表示左对齐。左对齐;正数前无符号,负数前加负号;
空格 右对齐;正数前加空格,负数前加负号; 0 右对齐;正数前无符号,负数前加负号;用0填充空白处;
.precision 可选,小数点后保留的位数
但是没有居中的功能。
print("qqqq%(name)-10sqqq"%{'name':'ok'})
qqqqok qqq
print("%+10d" % )
+
print("%-10d" %)
print("%04d" % )
print("%04d" % -)
-
print("% 4d" % )
print("%.2f" % 1.225)
1.23
typecode表示执行传入的字符串类型。有如下:
s,获取传入对象的__str__方法的返回值,并将其格式化到指定位置
r,获取传入对象的__repr__方法的返回值,并将其格式化到指定位置
c,整数:将数字转换成其unicode对应的值,10进制范围为 0 <= i <= 1114111(py27则只支持0-255);字符:将字符添加到指定位置
o,将整数转换成 八 进制表示,并将其格式化到指定位置
x,将整数转换成十六进制表示,并将其格式化到指定位置
d,将整数、浮点数转换成 十 进制表示,并将其格式化到指定位置
e,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(小写e)
E,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(大写E)
f, 将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位)
F,同上
g,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是e;)
G,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是E;)
%,当字符串中存在格式化标志时,需要用 %%表示一个百分号
但是没有将整数转换成二进制功能。
print('%%%d'%)
%
print('------%c-----%o-------%x'%(,,))
------A------------f
format函数初始化字符串:
[[fill]align][sign][#][0][width][,][.precision][type]
print('adad{0}adadada{0}dada{1}'.format(,))
adad1adadada1dada2
print('adad{name}adadada{age}'.format(name='OK',age=))
adadOKadadada22
居中功能并用a填充宽度为10.
print('adad{name:a^10s}adadada{age}'.format(name='OK',age=))
adadaaaaOKaaaaadadada22
左对齐<
print('adad{name:a<10s}adadada{age}'.format(name='OK',age=))
adadOKaaaaaaaaadadada22
右对齐>
print('adad{name:a>10s}adadada{age}'.format(name='OK',age=))
adadaaaaaaaaOKadadada22
转化百分比
print('this is {:%}'.format(0.2222))
this is 22.220000%
支持整数转化二进制输出:
print("---{0:d}----{0:b}---{0:o}--{1:%}".format(,0.2))
------------20.000000%
三:生成器和迭代器
具有生成一定条件数据的能力的对象叫做生成器。
具有取数据的能力叫做迭代器。
在进行处理大数据的时候,用生成器会降低内存的消耗,每一次取值生成一次,在下次取值的时候,内存会回收该值,避免了浪费内存。
其中filter函数和map函数返回的对象就是生成器。比如xrange函数返回的对象也是生成器。
a=[,,,]
f=filter(lambda a:a>,a) for i in f:
print(i)
print(f) <filter object at 0x004C5B50>
生成器本身由函数创造的,如何把普通的函数转成生成器呢?
如果函数体内包含关键字yield 时这个函数就是生成器。
def fun():
print()
yield 1
fun()
print(fun())
<generator object fun at 0x00584780>
在调用函数的fun()时候并不执行函数。只有去取这个对象的时候进行生成。
def fun():
yield
yield
yield
fun()
for i in fun():
print('__%s'%i)
print(fun())
__1
__2
__3
<generator object fun at 0x004E4780>
当for循环执行时,执行函数体。第一次的时候,去函数func找yield 对应的值1 赋值给i输出,第二次从第一次的位置下一个的yield的值为2取值并赋值给i,直到取到所有的yield的结束循环。每一次取值生成对应的对象。
上面的函数fun是生成器而生成的结果fun()是迭代器,也就说对象具有可以被迭代,在迭代时候执行next方法取值,只能从前往后取值, 练习:基于生成器生成range功能。
def myrange(args):
st=
while True:
if st >args:
return
yield st
st+=
ret=myrange()
for i in ret:
print(i)
四:函数递归。执行本身的函数体,当满足一定条件退出,并把最后执行的结果返回给上个函数,如果没有条件限制会无限执行下去。
def fun(x):
x+=
if x>:
return
return fun(x)
t=fun()
print(t)
执行3次fun(x)函数。循环执行多次相同的函数体。
练习:实现累乘功能,比如输入3 实现3*2*1
def fun(x):
if x==:
return
return x*fun(x-)
print(fun())
五:模块
分类:内置模块、第三方模块、自定义模块。在python中叫模块其他语言叫类库。
使用模块:先import 导入后使用。
存在方式:.py文件。或者一个文件夹里有多个.py文件组成的一个模块。
自定义模块导入:
目录之间用.表示
如果同一级不通模块导入相同的方法该如何区分呢???
1:通过相对路径来区分
aaarticlea/png;base64,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" alt="" />request模块调用上面的2个co模块。如果路径层级不多可以这么写 如果层级过多呢?调用次数过多呢?
import lib.co
import common.co
common.co.login()
lib.co.login()
common OK
lib OK
简单的方法 将导入的模块进行别名操作:
from lib import co as f1
from common import co as f2
f1.login()
f2.login()
lib OK
common OK
下面的方法是我们经常用的。
模块的意义:便于管理代码。不同的功能的代码进行归类。
模块导入的依据:
import sys
print(sys.path)
C:\python2\day6
C:\Users\Administrator\AppData\Local\Programs\Python\Python35-\python35.zip
C:\Users\Administrator\AppData\Local\Programs\Python\Python35-\DLLs
C:\Users\Administrator\AppData\Local\Programs\Python\Python35-\lib
C:\Users\Administrator\AppData\Local\Programs\Python\Python35-
C:\Users\Administrator\AppData\Local\Programs\Python\Python35-\lib\site-packages
sys.path是一个路径的列表。默认python 有限搜索当前py文件的目录依次搜索。所以当我们自定义模块时候可以有2种方式让python 找到我们定义的模块:
1:把自定义模块加入这个列表(append())
2:把自定义的模块加入上面的目录之中。
这样在导入模块的时候不会出现:ImportError: No module named 'xxx'
那怎么找出自己模块所在目录呢?
import os
print(os.path.abspath(__file__))
print(os.path.dirname(os.path.abspath(__file__)))
print(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) C:\python2\day6\s2.py
C:\python2\day6
C:\python2
根据自己需求将自己的变量导入sys.path即可。
模块的名称:不要和系统的内置模块的名字冲突。
第三方模块:1:pip进行安装
2:源码进行安装。
安装第三方模块:requests
pip install requests
常用模块介绍:
json模块:
常用函数dums()、dum();loads()、load()
对于加s参数和不加s参数区别:
加s的是直接可以对python 的数据转换成json串(dums())或者直接将json串转换成python能识别的数据类型。而不加s的是将python的数据转换成json串并将json串写入文件中,或者将文件中的json串转换成python的基本数据。
data=[,,,,(1,2,True)]
obl=json.dumps(data)
with open('data.txt','w') as f1:
f1.write(obl)
<class 'str'> [, , , , [, , true]]
如果需要写入需要操作文件才能写入。
data=[,,,,(,,True)]
obl=json.dumps(data)
t_load=json.loads(obl,encoding='utf8')
print(type(t_load),t_load)
<class 'list'> [, , , , [1, 2, True]]
在将python基本数据类型进行json转换的时候,会将python的一些数据类型或者相应的值进行转换,比如上面的python的元组转换json时候变为列表。True变为 true。
转换表如下:
aaarticlea/png;base64,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" alt="" />
跨语言平台常用该模块。该模块可以将python的基本数据类型(列表、字典)转换成字符串----序列化。也可以将字符串形式的python 类型字符创转换成对应的数据类型(列表、字典)--反序列化。
import json
list_1=[,,,,]
# json.dump(list_1,open('json.txt','w'))
obj=json.load(open('json.txt','r'))
print(obj)
[, , , ]
pickle模块:可以将非python数据类型的数据进行序列化和反序列化。存储方式是二进制。所以要以wb或者rb进行相关的dums和loads
import pickle
a='aa'
pickle.dump(bytes(a,encoding='utf-8'),open('pickle.txt','wb'))
pickle.dumps()将相应的数据类型转换成字节。如果不指定编码,python解释器会用默认编码进行处理。
import pickle
data=[,,,,(,,True)]
t=pickle.dumps(data)
print(t,type(t))
b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04K\x01K\x02\x88\x87q\x01e.' <class 'bytes'>
import pickle
a='aa'
# pickle.dump(bytes(a,encoding='utf-8'),open('pickle.txt','wb'))
t=pickle.load(open('pickle.txt','rb'))
s=str(t,encoding='utf-8')
print(s)
aa
import pickle
data=[,,,,(,,True)]
t=pickle.dumps(data)
t_load=pickle.loads(t)
print(t_load,type(t_load))
[, , , , (, , True)] <class 'list'>
在Django中会用到经常用到pickle模块。
requests模块:属于第三方模块需要进行手动安装(pip install requests)
进入python安装目录:E:\python3.6\Scripts
运行:pip.exe install request
import requests
import json
res=requests.get("http://wthrcdn.etouch.cn/weather_mini?city=北京")
res.encoding='utf-8'
print(type(res))
dict_1=json.loads(res.text)
print(dict_1)
time模块和datatime 模块
获取本地准确时间:
1 import time
2 print( time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time())))
3
4 2016-09-23 21:50:45
time模块:首先了解下
时间戳的概念:时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
1:获取本地时间戳
import time,datetime
print(time.time())##获取本地的时间的时间戳。
1465714711.3878157
2:获取本地时间。
import time,datetime
print(time.ctime())
Sun Jun ::
3:获取本地时间的时间struct_time格式。
print(time.localtime())
time.struct_time(tm_year=, tm_mon=, tm_mday=, tm_hour=, tm_min=, tm_sec=, tm_wday=, tm_yday=, tm_isdst=)
4:将时间戳转换成字符串时间
import time,datetime
print(time.ctime(time.time()))
Sun Jun ::
5:将时间戳转成struct_time
格式。time.mktime把struct_time格式的时间转换成时间戳。
print(time.mktime(time.gmtime()))
1465687430.0
struct_time格式是元组,可以进行相关取值。
这种获取的struct_time格式是hour不是本地地时间的hour,查时区的8小时。也就是说time.time()格林威治时间戳。换成time.localtime()
import time,datetime
print(time.gmtime(time.time()))
time.struct_time(tm_year=, tm_mon=, tm_mday=, tm_hour=7, tm_min=, tm_sec=, tm_wday=, tm_yday=, tm_isdst=)
1 print(time.localtime())
time.struct_time(tm_year=, tm_mon=, tm_mday=, tm_hour=, tm_min=, tm_sec=, tm_wday=, tm_yday=, tm_isdst=)
5:将struct_time格式转换成指定字符串时间格式
1 import time,datetime
2 print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime(time.time())))
3 2016-06-12 07:14:47
注意:也就是说首先需要获取时间戳然后转换成struct_time格式然后转换成你想要的时间格式。
可以把指定的时间格式字符串转换成struct_time格式然后在转换成时间戳。
print(time.strptime('2016-06-12 07:14:47',"%Y-%m-%d %H:%M:%S"))
time.struct_time(tm_year=, tm_mon=, tm_mday=, tm_hour=, tm_min=, tm_sec=, tm_wday=, tm_yday=, tm_isdst=-)
print(time.mktime(time.strptime('2016-06-12 07:14:47',"%Y-%m-%d %H:%M:%S")))
1465686887.0
datetime模块:
返回当前时间格式xx-xx-xx
print(datetime.datetime.today())
-- ::21.323805
可以用切割获取我们想要的格式:
1 TIME=datetime.datetime.today()
2 TIME_INT=str(TIME).split('.')[0]
3 print(TIME_INT)
4 2016-06-12 16:40:00
将时间戳转换成时间字符串
print(datetime.datetime.fromtimestamp(time.time()))
-- ::05.047899
输出当前时间:
print(datetime.datetime.now())
-- ::07.611796
也可以将时间格式的转换成字符换进行进行切割出大约的时间(因为毫秒去掉)
将时间戳转换成struct_time格式 如下输出不存在时区问题。
TIME=datetime.datetime.now()
print(TIME.timetuple())
time.struct_time(tm_year=, tm_mon=, tm_mday=, tm_hour=, tm_min=, tm_sec=, tm_wday=, tm_yday=, tm_isdst=-)
将字符串转化成日期格式。
str_to_date = datetime.datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")
-- ::
时间的加减:
new_date = datetime.datetime.now() + datetime.timedelta(days=10)##比现在时间加10天。
print(new_date)
2016-06-22 17:29:11.435878
new_date = datetime.datetime.now() + datetime.timedelta(days=-10)## 比现在减10天。
print(new_date)
2016-06-02 17:30:33.124046
new_date = datetime.datetime.now() + datetime.timedelta(hours=-10)#比现在减10小时。
print(new_date)
new_date = datetime.datetime.now() + datetime.timedelta(seconds=120)#比现在加120秒。
print(new_date)
2016-06-12 17:36:07.311463
模块:logging
首先创建logging实例。然后创建handler,分两种 一种输出到文件中 Filehandler,一种输出到终端的Streamhandler.分别为这两种handler指定输出格式setformatter
然后将这2种handler添加(add)到logging实例中。该实例就有输出到文件和终端的日志信息的属性。
实际例子:
import logging
def logsystem(x):
log=logging.getLogger("mylog")##定义一个logging的实例log
log.setLevel(logging.INFO) #设置全局日志级别,如果handler的日志级别低于INFO,不会输出日志信息。 fl=logging.FileHandler(x,encoding='utf-8')##设置一个文件输出的Filehandler.可以指定输出文件的编码,写入方式默认a追加,可以指定。
fl.setLevel(logging.ERROR)#设置输出级别ERROR con=logging.StreamHandler()#设置终端Streamhandler.
con.setLevel(logging.INFO)#设置输出日志信息级别。 Formate=logging.Formatter(('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))#设置输出日志格式。主要asctime是输出时间。name是上面logging实例名字"mylog"。message是在调用的时候输入的日志信息。
fl.setFormatter(Formate)#分别给各个handler设置日志格式。
con.setFormatter(Formate) log.addHandler(fl)#给logging实例log添加handler属性。
log.addHandler(con)
return log#该函数的返回值是logging实例。
1: logging.getLogger([name])
返回一个logger实例,如果没有指定name,返回root logger。只要name相同,返回的logger实例都是同一个而且只有一个,即name和log实例是一一对应的。这意味着,无需把logger实例在各个模块中传递。
只要知道name,就能得到 同一个logger实例
2:Log.setLevel(lvl)
设置logger的level, level有以下几个级别:NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
如果把looger的级别设置为INFO, 那么小于INFO级别的日志都不输出, 大于等于INFO级别的日志都输出
log.debug("foobar") # 不输出
log.info("foobar") # 输出
log.warning("foobar") # 输出
log.error("foobar") # 输出
log.critical("foobar") # 输出
3:Log.addHandler(hdlr)
log可以雇佣handler来帮它处理日志, handler主要有以下几种:
StreamHandler: 输出到控制台
FileHandler: 输出到文件
handler还可以设置自己的level以及输出格式。
logging.basicConfig([**kwargs])
* 这个函数用来配置root logger, 为root logger创建一个StreamHandler, 设置默认的格式。
* 这些函数: logging.debug()、logging.info()、logging.warning()、
logging.error()、logging.critical() 如果调用的时候发现root logger没有任何
handler, 会自动调用basicConfig添加一个handler
* 如果root logger已有handler, 这个函数不做任何事情
使用basicConfig来配置root logger的输出格式和level:
import logging
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
logging.debug('This message should appear on the console')
完整的例子:
class Logger:
'''
功能:该类主要是日志实例的创建。
:param:filename:文件名字。
:param:logger:创建日志实例的名字。注意这个是变量。而且必须要有的变量。否则日志文件内容会乱。
:return:Log返回一个创建的log的实例。
'''
def __init__(self,filename,logger):
self.filename=filename
self.logger=logger
def log_in(self):
Log=logging.getLogger(self.logger)
Log.setLevel(logging.INFO)
f1=logging.FileHandler(os.path.join(LOG_DIR,self.filename),encoding='utf-8')
f1.setLevel(logging.INFO)
formate=logging.Formatter(('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
f1.setFormatter(formate)
Log.addHandler(f1)
return Log
day5--<装饰器、模块、字符串格式化、生成器、迭代器>logging模块的更多相关文章
- python_way ,day5 模块,模块3 ,双层装饰器,字符串格式化,生成器,递归,模块倒入,第三方模块倒入,序列化反序列化,日志处理
python_way.day5 1.模块3 time,datetime, json,pickle 2.双层装饰器 3.字符串格式化 4.生成器 5.递归 6.模块倒入 7.第三方模块倒入 8.序列化反 ...
- Day5 双层装饰器、字符串格式化、生成器、迭代器、递归
双层装饰器实现用户登录和权限认证 #!/usr/bin/env python# -*- coding: utf-8 -*-# Author: WangHuafeng USER_INFO = {} de ...
- Python_Day_5装饰器、字符串格式化、序列化、内置模块、生成器、迭代器之篇
一.装饰器 为什么要用装饰器??? 在实际的开发环境中应遵循开发封闭原则,虽然在这个原则是用的面向对象开发,但也适用于函数式编程,简单地说,它规定已经实现的功能代码不是允许修改的,但是可以被扩展: 封 ...
- python14 1.带参装饰器 | wrapper 了了解 # 2.迭代器 ***** # 可迭代对象 # 迭代器对象 # for迭代器 # 枚举对象
## 复习 '''函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 ...
- 学习PYTHON之路, DAY 5 - PYTHON 基础 5 (装饰器,字符格式化,递归,迭代器,生成器)
---恢复内容开始--- 一 装饰器 1 单层装饰器 def outer(func): def inner(): print('long') func() print('after') return ...
- python学习之day5,装饰器,生成器,迭代器,json,pickle
1.装饰器 import os import time def auth(type): def timeer(func): def inner(*args,**kwargs): start = tim ...
- python函数与模块(装饰器,文件处理,迭代器等)
os模块 os.system('命令') 利用python调用系统命令,命令可以是以列表或者元组内的元素形式* res import os res=os.system('ipconfig') prin ...
- Python学习日记(十)—— 杂货铺(全局变量补充、Python参数传递、字符串格式化、迭代器、生成器)
全局变量补充 python自己添加了些全局变量 print(vars()) """结果: {'__name__': '__main__', '__doc__': None ...
- 生成器&迭代器,模块
列表生成式 将列表data=[1,2,3]里的元素都乘2 方法一 data=[1,2,3] for index,i in enumerate(data): data[index] *=2 print( ...
随机推荐
- pycharm上运行django服务器端、ip地址访问
安装Django 下载Django包,解压缩. CMD 进入解压路径下. 执行:python setup.py install 增加环境变量: C:\Python27\Scripts 测试djang ...
- consul的安装配置 一centos7环境
centos7上consul的安装--新手笔记 环境 我用的是centos7, 用的是vmware 一 安装系统后首先要设置ip ifconfig eth0 →查看IP 不过输出的信息多一些 ifco ...
- shell学习笔记1
知识点1.修改输出的颜色 echo -e "\e[1;31m This is red text \e[0m" 其中,\e[1;31m 表示将输出显示为红色: \e[0m 标识将颜色 ...
- Android:padding和android:layout_margin的区别
padding是站在父view的角度描述问题,它规定它里面的内容必须与这个父view边界的距离. margin则是站在自己的角度描述问题,规定自己和其他(上下左右)的view之间的距离
- Server asks us to fall back to SIMPLE auth, but this client is configured to only allow secure connections.
我是在flume向hdfs 写(sink)数据时遇到的这个错误. Server (是指hdfs) asks us to fall back to SIMPLE auth, but this clien ...
- Linux 控制 配置 减少 交换分区 SWAP 虚拟内存使用
对于某些大型应用来说,SWAP 严重影响性能,尽可能避免使用: The Linux kernel provides a tweakable setting that controls how ofte ...
- html知识2
1.超链接 语法:<a href "" target="打开方式" name="页面锚点名称">链接文字或者图片</a&g ...
- C关键字
1 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义
- Windows Store App 访问应用内部文件
访问应用程序内部的文件可以使用多种不同的方法,13.1节中已经介绍过相关的方法,除此之外,还可以使用文件的URI地址直接对文件进行检索,这种访问方式需要用到StorageFile类的静态方法GetFi ...
- 0429 Scrum团队成立与第6-7章读后感
Scrum团队成立: 团队名称:何首污大战污妖王 团队目标:每个人都尽可能的学到东西,共同进步. 团队口号:因为自信,所以成功! 团队照: 角色分配 产品负责人(梁毅乾): 决定开发内容和优先级排序, ...