本篇文章将介绍如何将语句组织成函数,以及参数概念以及在程序中的用途

本文地址:http://www.cnblogs.com/archimedes/p/python-function.html,转载请注明源地址。

Pythond 的函数是由一个新的语句编写,即def,def是可执行的语句--函数并不存在,直到Python运行了def后才存在。

函数是通过赋值传递的,参数通过赋值传递给函数

def语句将创建一个函数对象并将其赋值给一个变量名,def语句的一般格式如下:

  1. def function_name(arg1,arg2[,...]):
  2. statement
  3. [return value]

返回值不是必须的,如果没有return语句,则Python默认返回值None。

函数名的命名规则:

  • 函数名必须以下划线或字母开头,可以包含任意字母、数字或下划线的组合。不能使用任何的标点符号;

  • 函数名是区分大小写的。

  • 函数名不能是保留字。

Python使用名称空间的概念存储对象,这个名称空间就是对象作用的区域, 不同对象存在于不同的作用域。下面是不同对象的作用域规则:

  • 每个模块都有自已的全局作用域。

  • 函数定义的对象属局部作用域,只在函数内有效,不会影响全局作用域中的对象。

  • 赋值对象属局部作用域,除非使用global关键字进行声明。

LGB规则是Python查找名字的规则,下面是LGB规则:

1.大多数名字引用在三个作用域中查找:先局部(Local),次之全局(Global),再次之内置(Build-in)。

  1. >>> a=2
  2. >>> b=2
  3. >>> def test(b):
  4. ... test=a*b
  5. ... return test
  6. >>>print test(10)
  7. 20

b在局部作用域中找到,a在全局作用域中找到。

2.如想在局部作用域中改变全局作用域的对象,必须使用global关键字。

  1. #没用global时的情况
  2. >>> name="Jims"
  3. >>> def set():
  4. ... name="ringkee"
  5. ...
  6. >>> set()
  7. >>> print name
  8. Jims
  9.  
  10. #使用global后的情况
  11. >>> name="Jims"
  12. >>> def set1():
  13. ... global name
  14. ... name="ringkee"
  15. ...
  16. >>> set1()
  17. >>> print name
  18. ringkee

3.'global'声明把赋值的名字映射到一个包含它的模块的作用域中。

函数的参数是函数与外部沟通的桥梁,它可接收外部传递过来的值。参数传递的规则如下:

4.在一个函数中对参数名赋值不影响调用者。

  1. >>> a=1
  2. >>> def test(a):
  3. ... a=a+1
  4. ... print a
  5. ...
  6. >>> test(a)
  7. 2
  8. >>> a
  9. 1 # a值不变

5.在一个函数中改变一个可变的对象参数会影响调用者。

  1. >>> a=1
  2. >>> b=[1,2]
  3. >>> def test(a,b):
  4. ... a=5
  5. ... b[0]=4
  6. ... print a,b
  7. ...
  8. >>> test(a,b)
  9. 5 [4, 2]
  10. >>> a
  11. 1
  12. >>> b
  13. [4, 2] # b值已被更改

参数是对象指针,无需定义传递的对象类型。如:

  1. >>> def test(a,b):
  2. ... return a+b
  3. ...
  4. >>> test(1,2) #数值型
  5. 3
  6. >>> test("a","b") #字符型
  7. 'ab'
  8. >>> test([12],[11]) #列表
  9. [12, 11]

函数中的参数接收传递的值,参数可分默认参数,如:

  1. def function(ARG=VALUE)

元组(Tuples)参数:

  1. def function(*ARG)

字典(dictionary)参数:

  1. def function(**ARG)

一些函数规则:

  • 默认值必须在非默认参数之后;

  • 在单个函数定义中,只能使用一个tuple参数(*ARG)和一个字典参数(**ARG)。

  • tuple参数必须在连接参数和默认参数之后。

  • 字典参数必须在最后定义。


1.常用函数

1.abs(x)

abs()返回一个数字的绝对值。如果给出复数,返回值就是该复数的模。

  1. >>>print abs(-100)
  2. 100
  3. >>>print abs(1+2j)
  4. 2.2360679775

2.callable(object)

callable()函数用于测试对象是否可调用,如果可以则返回1(真);否则返回0(假)。可调用对象包括函数、方法、代码对象、类和已经定义了“调用”方法的类实例。

  1. >>> a=""
  2. >>> print callable(a)
  3. 0
  4. >>> print callable(chr)
  5. 1

3.cmp(x,y)

cmp()函数比较x和y两个对象,并根据比较结果返回一个整数,如果x<y,则返回-1;如果x>y,则返回1,如果x==y则返回0。

  1. >>>a=1
  2. >>>b=2
  3. >>>c=2
  4. >>> print cmp(a,b)
  5. -1
  6. >>> print cmp(b,a)
  7. 1
  8. >>> print cmp(b,c)
  9. 0

4.divmod(x,y)

divmod(x,y)函数完成除法运算,返回商和余数。

  1. >>> divmod(10,3)
  2. (3, 1)
  3. >>> divmod(9,3)
  4. (3, 0)

5.isinstance(object,class-or-type-or-tuple) -> bool

测试对象类型

  1. >>> a='isinstance test'
  2. >>> b=1234
  3. >>> isinstance(a,str)
  4. True
  5. >>> isinstance(a,int)
  6. False
  7. >>> isinstance(b,str)
  8. False
  9. >>> isinstance(b,int)
  10. True

下面的程序展示了isinstance函数的使用:

  1. def displayNumType(num):
  2. print num, 'is',
  3. if isinstance(num, (int, long, float, complex)):
  4. print 'a number of type:', type(num).__name__
  5. else:
  6. print 'not a number at all!!!'
  7. displayNumType(-69)
  8. displayNumType(9999999999999999999999999L)
  9. displayNumType(565.8)
  10. displayNumType(-344.3+34.4j)
  11. displayNumType('xxx')

代码运行结果如下:

-69 is a number of type: int
9999999999999999999999999 is a number of type: long
565.8 is a number of type: float
(-344.3+34.4j) is a number of type: complex
xxx is not a number at all!!!

6.len(object) -> integer

len()函数返回字符串和序列的长度。

  1. >>> len("aa")
  2. 2
  3. >>> len([1,2])
  4. 2

7.pow(x,y[,z])

pow()函数返回以x为底,y为指数的幂。如果给出z值,该函数就计算x的y次幂值被z取模的值。

  1. >>> print pow(2,4)
  2. 16
  3. >>> print pow(2,4,2)
  4. 0
  5. >>> print pow(2.4,3)
  6. 13.824

8.range([lower,]stop[,step])

range()函数可按参数生成连续的有序整数列表。

  1. >>> range(10)
  2. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  3. >>> range(1,10)
  4. [1, 2, 3, 4, 5, 6, 7, 8, 9]
  5. >>> range(1,10,2)
  6. [1, 3, 5, 7, 9]

9.round(x[,n])

round()函数返回浮点数x的四舍五入值,如给出n值,则代表舍入到小数点后的位数。

  1. >>> round(3.333)
  2. 3.0
  3. >>> round(3)
  4. 3.0
  5. >>> round(5.9)
  6. 6.0

10.type(obj)

type()函数可返回对象的数据类型。

  1. >>> type(a)
  2. <type 'list'>
  3. >>> type(copy)
  4. <type 'module'>
  5. >>> type(1)
  6. <type 'int'>

11.xrange([lower,]stop[,step])

xrange()函数与range()类似,但xrnage()并不创建列表,而是返回一个xrange对象,它的行为与列表相似,但是只在需要时才计算列表值,当列表很大时,这个特性能为我们节省内存。

  1. >>> a=xrange(10)
  2. >>> print a[0]
  3. 0
  4. >>> print a[1]
  5. 1
  6. >>> print a[2]
  7. 2

2.内置类型转换函数

1.chr(i)

chr()函数返回ASCII码对应的字符串。

  1. >>> print chr(65)
  2. A
  3. >>> print chr(66)
  4. B
  5. >>> print chr(65)+chr(66)
  6. AB

2.complex(real[,imaginary])

complex()函数可把字符串或数字转换为复数。

  1. >>> complex("2+1j")
  2. (2+1j)
  3. >>> complex("")
  4. (2+0j)
  5. >>> complex(2,1)
  6. (2+1j)
  7. >>> complex(2L,1)
  8. (2+1j)

3.float(x)

float()函数把一个数字或字符串转换成浮点数。

  1. >>> float("")
  2. 12.0
  3. >>> float(12L)
  4. 12.0
  5. >>> float(12.2)
  6. 12.199999999999999

4.hex(x)

hex()函数可把整数转换成十六进制数。

  1. >>> hex(16)
  2. '0x10'
  3. >>> hex(123)
  4. '0x7b'

5.long(x[,base])

long()函数把数字和字符串转换成长整数,base为可选的基数。

  1. >>> long("")
  2. 123L
  3. >>> long(11)
  4. 11L

6.list(x)

list()函数可将序列对象转换成列表。如:

  1. >>> list("hello world")
  2. ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
  3. >>> list((1,2,3,4))
  4. [1, 2, 3, 4]

7.int(x[,base])

int()函数把数字和字符串转换成一个整数,base为可选的基数。

  1. >>> int(3.3)
  2. 3
  3. >>> int(3L)
  4. 3
  5. >>> int("")
  6. 13
  7. >>> int("",15)
  8. 19

8.min(x[,y,z...])

min()函数返回给定参数的最小值,参数可以为序列。

  1. >>> min(1,2,3,4)
  2. 1
  3. >>> min((1,2,3),(2,3,4))
  4. (1, 2, 3)

9.max(x[,y,z...])

max()函数返回给定参数的最大值,参数可以为序列。

  1. >>> max(1,2,3,4)
  2. 4
  3. >>> max((1,2,3),(2,3,4))
  4. (2, 3, 4)

10.oct(x)

oct()函数可把给出的整数转换成八进制数。

  1. >>> oct(8)
  2. ''
  3. >>> oct(123)
  4. ''

11.ord(x)

ord()函数返回一个字符串参数的ASCII码或Unicode值。

  1. >>> ord("a")
  2. 97
  3. >>> ord(u"a")
  4. 97

12.str(obj)

str()函数把对象转换成可打印字符串。

  1. >>> str("")
  2. ''
  3. >>> str(4)
  4. ''
  5. >>> str(3+2j)
  6. '(3+2j)'

13.tuple(x)

tuple()函数把序列对象转换成tuple。

  1. >>> tuple("hello world")
  2. ('h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd')
  3. >>> tuple([1,2,3,4])
  4. (1, 2, 3, 4)

3.序列处理函数

1.常用函数中的len()、max()和min()同样可用于序列。

2.filter(function,list)

调用filter()时,它会把一个函数应用于序列中的每个项,并返回该函数返回真值时的所有项,从而过滤掉返回假值的所有项。

  1. >>> def nobad(s):
  2. ... return s.find("bad") == -1
  3. ...
  4. >>> s = ["bad","good","bade","we"]
  5. >>> filter(nobad,s)
  6. ['good', 'we']

这个例子通过把nobad()函数应用于s序列中所有项,过滤掉所有包含“bad”的项。

3.map(function,list[,list])

map()函数把一个函数应用于序列中所有项,并返回一个列表。

  1. >>> import string
  2. >>> s=["python","zope","linux"]
  3. >>> map(string.capitalize,s)
  4. ['Python', 'Zope', 'Linux']

map()还可同时应用于多个列表。如:

  1. >>> import operator
  2. >>> s=[1,2,3]; t=[3,2,1]
  3. >>> map(operator.mul,s,t) # s[i]*t[j]
  4. [3, 4, 3]

如果传递一个None值,而不是一个函数,则map()会把每个序列中的相应元素合并起来,并返回该元组。如:

  1. >>> a=[1,2];b=[3,4];c=[5,6]
  2. >>> map(None,a,b,c)
  3. [(1, 3, 5), (2, 4, 6)]

4.reduce(function,seq[,init])

reduce()函数获得序列中前两个项,并把它传递给提供的函数,获得结果后再取序列中的下一项,连同结果再传递给函数,以此类推,直到处理完所有项为止。

  1. >>> import operator
  2. >>> reduce(operator.mul,[2,3,4,5]) # ((2*3)*4)*5
  3. 120
  4. >>> reduce(operator.mul,[2,3,4,5],1) # (((1*2)*3)*4)*5
  5. 120
  6. >>> reduce(operator.mul,[2,3,4,5],2) # (((2*2)*3)*4)*5
  7. 240

5.zip(seq[,seq,...])

zip()函数可把两个或多个序列中的相应项合并在一起,并以元组的格式返回它们,在处理完最短序列中的所有项后就停止。

  1. >>> zip([1,2,3],[4,5],[7,8,9])
  2. [(1, 4, 7), (2, 5, 8)]

如果参数是一个序列,则zip()会以一元组的格式返回每个项,如:

  1. >>> zip((1,2,3,4,5))
  2. [(1,), (2,), (3,), (4,), (5,)]
  3. >>> zip([1,2,3,4,5])
  4. [(1,), (2,), (3,), (4,), (5,)]

4.其他

def语句是实时执行的,当它运行的时候,它创建并将一个新的函数对象赋值给一个变量名,Python所有的语句都是实时执行的,没有像独立的编译时间这样的流程

由于是语句,def可以出现在任一语句可以出现的地方--甚至是嵌套在其他语句中:

  1. if test:
  2. def fun():
  3. ...
  4. else:
  5. def func():
  6. ...
  7. ...
  8. func()

可以将函数赋值给一个不同的变量名,并通过新的变量名进行调用:

  1. othername=func()
  2. othername()

创建函数

内建的callable函数可以用来判断函数是否可调用:

  1. >>> import math
  2. >>> x=1
  3. >>> y=math.sqrt
  4. >>> callable(x)
  5. False
  6. >>> callable(y)
  7. True

使用del语句定义函数:

  1. >>> def hello(name):
  2.    return 'Hello, '+name+'!'
  3. >>> print hello('world')
  4. Hello, world!
  5. >>> print hello('Gumby')
  6. Hello, Gumby!

编写一个fibnacci数列函数:

  1. >>> def fibs(num):
  2.    result=[0,1]
  3.   for i in range(num-2):
  4.    result.append(result[-2]+result[-1])
  5.    return result
  6. >>> fibs(10)
  7. [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
  8. >>> fibs(15)
  9. [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]

在函数内为参数赋值不会改变外部任何变量的值:

  1. >>> def try_to_change(n):
  2.    n='Mr.Gumby'
  3. >>> name='Mrs.Entity'
  4. >>> try_to_change(name)
  5. >>> name
  6. 'Mrs.Entity'

由于字符串(以及元组和数字)是不可改变的,故做参数的时候也就不会改变,但是如果将可变的数据结构如列表用作参数的时候会发生什么:

  1. >>> name='Mrs.Entity'
  2. >>> try_to_change(name)
  3. >>> name
  4. 'Mrs.Entity'
  5. >>> def change(n):
  6.    n[0]='Mr.Gumby'
  7.  
  8. >>> name=['Mrs.Entity','Mrs.Thing']
  9. >>> change(name)
  10. >>> name
  11. ['Mr.Gumby', 'Mrs.Thing']

参数发生了改变,这就是和前面例子的重要区别

以下不用函数再做一次:

  1. >>> name=['Mrs.Entity','Mrs.Thing']
  2. >>> n=name #再来一次,模拟传参行为
  3. >>> n[0]='Mr.Gumby' #改变列表
  4. >>> name
  5. ['Mr.Gumby', 'Mrs.Thing']

当2个变量同时引用一个列表的时候,它们的确是同时引用一个列表,想避免这种情况,可以复制一个列表的副本,当在序列中做切片的时候,返回的切片总是一个副本,所以复制了整个列表的切片,将会得到一个副本:

  1. >>> names=['Mrs.Entity','Mrs.Thing']
  2. >>> n=names[:]
  3. >>> n is names
  4. False
  5. >>> n==names
  6. True

此时改变n不会影响到names:

  1. >>> n[0]='Mr.Gumby'
  2. >>> n
  3. ['Mr.Gumby', 'Mrs.Thing']
  4. >>> names
  5. ['Mrs.Entity', 'Mrs.Thing']
  6. >>> change(names[:])
  7. >>> names
  8. ['Mrs.Entity', 'Mrs.Thing']

关键字参数和默认值

参数的顺序可以通过给参数提供参数的名字(但是参数名和值一定要对应):

  1. >>> def hello(greeting, name):
  2. print '%s,%s!'%(greeting, name)
  3. >>> hello(greeting='hello',name='world!')
  4. hello,world!!

关键字参数最厉害的地方在于可以在参数中给参数提供默认值:

  1. >>> def hello_1(greeting='hello',name='world!'):
  2.   print '%s,%s!'%(greeting,name)
  3.  
  4. >>> hello_1()
  5. hello,world!!
  6. >>> hello_1('Greetings')
  7. Greetings,world!!
  8. >>> hello_1('Greeting','universe')
  9. Greeting,universe!

若想让greeting使用默认值:

  1. >>> hello_1(name='Gumby')
  2. hello,Gumby!

可以给函数提供任意多的参数,实现起来也不难:

  1. >>> def print_params(*params):
  2.    print params
  3.  
  4. >>> print_params('Testing')
  5. ('Testing',)
  6. >>> print_params(1,2,3)
  7. (1, 2, 3)

混合普通参数:

  1. >>> def print_params_2(title,*params):
  2.    print title
  3.    print params
  4.  
  5. >>> print_params_2('params:',1,2,3)
  6. params:
  7. (1, 2, 3)
  8. >>> print_params_2('Nothing:')
  9. Nothing:
  10. ()

星号的意思就是“收集其余的位置参数”,如果不提供任何供收集的元素,params就是个空元组

但是不能处理关键字参数:

  1. >>> print_params_2('Hmm...',something=42)
  2. Traceback (most recent call last):
  3. File "<pyshell#112>", line 1, in <module>
  4. print_params_2('Hmm...',something=42)
  5. TypeError: print_params_2() got an unexpected keyword argument 'something'

试试使用“**”:

  1. >>> def print_params(**params):
  2.    print params
  3.  
  4. >>> print_params(x=1,y=2,z=3)
  5. {'y': 2, 'x': 1, 'z': 3}
  6. >>> def parames(x,y,z=3,*pospar,**keypar):
  7.    print x,y,z
  8.    print pospar
  9.    print keypar
  10.  
  11. >>> parames(1,2,3,5,6,7,foo=1,bar=2)
  12. 1 2 3
  13. (5, 6, 7)
  14. {'foo': 1, 'bar': 2}
  15. >>> parames(1,2)
  16. 1 2 3
  17. ()
  18. {}
  19. >>> def print_params_3(**params):
  20.    print params
  21.  
  22. >>> print_params_3(x=1,y=2,z=3)
  23. {'y': 2, 'x': 1, 'z': 3}
  24. >>> #返回的是字典而不是元组
  25. >>> #组合‘#’与'##'
  26. >>> def print_params_4(x,y,z=3,*pospar,**keypar):
  27.    print x,y,z
  28.    print pospar
  29.    print keypar
  30.  
  31. >>> print_params_4(1,2,3,5,6,7,foo=1,bar=2)
  32. 1 2 3
  33. (5, 6, 7)
  34. {'foo': 1, 'bar': 2}
  35. >>> print_params_4(1,2)
  36. 1 2 3
  37. ()
  38. {}

Python基础(7)--函数的更多相关文章

  1. python基础——匿名函数

    python基础——匿名函数 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便.  在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x2时 ...

  2. python基础——返回函数

    python基础——返回函数 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回.  我们来实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_ ...

  3. python基础——sorted()函数

    python基础——sorted()函数 排序算法 排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个d ...

  4. python基础——filter函数

    python基础——filter函数 Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函 ...

  5. python基础——匿名函数及递归函数

    python基础--匿名函数及递归函数 1 匿名函数语法 匿名函数lambda x: x * x实际上就是: def f(x): return x * x 关键字lambda表示匿名函数,冒号前面的x ...

  6. 八. Python基础(8)--函数

    八. Python基础(8)--函数 1 ● 函数返回布尔值 注意, 自定义的函数也可以是用来作逻辑判断的, 例如内置的startswith()等函数. def check_len(x):     ' ...

  7. python基础之函数详解

    Python基础之函数详解 目录 Python基础之函数详解 一.函数的定义 二.函数的调用 三.函数返回值 四.函数的参数 4.1 位置参数 4.2 关键字参数 实参:位置实参和关键字参数的混合使用 ...

  8. Python学习笔记(一)python基础与函数

    1.python基础 1.1输入与输出 输出 用print加上字符串,就可以打印指定的文字或数字 >>> print 'hello, world' hello, world > ...

  9. Day3 - Python基础3 函数、递归、内置函数

    Python之路,Day3 - Python基础3   本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8. ...

  10. Python基础__函数

    本节将进入函数的介绍,函数是Python基础中最精彩的部分之一,接下来将对函数做详细介绍.函数 函数就是对代码进行一个封装.把实现某一功能的代码进行封装到一起.下次需要使用时不需要进行编写代码直接调用 ...

随机推荐

  1. Android代码优化工具——Android lint

    作为移动应用开发者,我们总希望发布的apk文件越小越好,不希望资源文件没有用到的图片资源也被打包进apk,不希望应用中使用了高于minSdk的api,也不希望AndroidManifest文件存在异常 ...

  2. 轻应用、Web app 、Native app三者区别关系是什么?

    [龙友导读]最近百度公司在大会上宣布推出“轻应用”.轻应用到底是什么呢,和我们说的web app.native app到底有什么区别?是新生物的诞生还是概念的炒作?所以,今天特意为大家整理分享一篇这方 ...

  3. Spring中加载ApplicationContext.xml文件的方式

    Spring中加载ApplicationContext.xml文件的方式 原文:http://blog.csdn.net/snowjlz/article/details/8158560 1.利用Cla ...

  4. ruby -- 基础学习(一)项目文件夹说明

    App文件夹子文件夾功能介绍 (1)controllers  存放驱动业务逻辑的控制器 (2)helpers       存放视图辅助类,一些常用的代码段 (3)mailers       Rails ...

  5. [git]使用GPG签名你的commit

    概述 GPG是一种加密算法,现在github支持commit使用GPG加密,从而保证提交的commit在传输的过程中没有被篡改. 一.生成GPG密钥 什么是GPG:阮一峰的GPG教程 安装GPG:br ...

  6. IT人的自我导向型学习:学习的3个维度

    看到大家对我的文章赞了不少,看来大家还比较喜欢看.园子里的一些朋友和我说:”终于又看到你要在园子里发原创文章了.几年前就受益匪浅,经过几年的成长分享来的东西肯定也是精品.“ 感谢大家对我的信任,如果你 ...

  7. [ASP.NET]分析MVC5源码,并实现一个ASP.MVC

    本节内容不是MVC入门教程,主要讲MVC原理,实现一个和ASP.NET MVC类似基本原理的项目. MVC原理是依赖于ASP.NET管道事件基础之上的.对于这块,可阅读上节内容 [ASP.NET]谈谈 ...

  8. Opserver监控工具的使用

    Opserver监控工具的使用 Opserver是Stack Overflow的开源监控解决方案,由Stack Exchange发布,基于.NET框架构建.开源地址:https://github.co ...

  9. Ubuntu14.04安装ROOT集群

    之前尝试在CentOS7上部署ROOT集群,却发现无论是源码包安装,还是官方提供的二进制包,都缺少了关键的xproofd可执行文件,导致PoD不能运行.没有办法,只能尝试在其他OS上部署,这里我选择了 ...

  10. [moka学习笔记]yii2.0 rules的用法(收集,不定期更新)

    public function rules(){ return [ ['title','required','message'=>'标题不能为空'], ['title','string','mi ...