python函数

内容大纲:

     一.深浅拷贝

     二.函数

一、深浅拷贝

对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。

 

对于字典、元组、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同。赋值,只是创建一个变量,该变量指向原来内存地址,如:

浅拷贝,在内存中只额外创建第一层数据。

深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化.

二、函数

函数的定义主要有如下要点:

  • def:表示函数的关键字
  • 函数名:函数的名称,日后根据函数名调用函数
  • 函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...
  • 参数:为函数体提供数据
  • 返回值:当函数执行完毕后,可以给调用者返回数据。

1.返回值

如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。return具有结束函数的作用:

def show():
print('a')
return 1+2
print('b')
ret=show()
print(ret)

2.参数 参考:http://blog.csdn.net/kkevinyang/article/details/52248892

1)位置参数

我们先写一个计算x2的函数:

def power(x):

  return x * x   #对于power(x)函数,参数x就是一个位置参数

传入两个位置参数:

def power(x, n):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

2)默认参数

设置默认参数时,有几点要注意:

一是必选参数在前,默认参数在后,否则Python的解释器会报错。

二是如何设置默认参数。

当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。

使用默认参数有什么好处?最大的好处是能降低调用函数的难度。

def power(x, n=2):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

3)可变参数

定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号。在函数内部,参数numbers接收到的是一个tuple,因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数:

如果已经有一个list或者tuple,要调用一个可变参数怎么办?可以这样做:

4)关键字参数

可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。

函数person除了必选参数nameage外,还接受关键字参数kw。在调用该函数时,可以只传入必选参数:

也可以传入任意个数的关键字参数:

5)命名关键字参数

和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符后面的参数被视为命名关键字参数。 
如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和job作为关键字参数。这种方式定义的函数如下:

def person(name, age, *, city, job):
    print(name, age, city, job)
  • 1
  • 2
  • 1
  • 2

调用方式如下:

>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer
  • 1
  • 2
  • 1
  • 2

要特别注意,*不是参数,而是特殊分隔符。如果缺少*,Python解释器将无法识别位置参数和命名关键字参数

6)参数组合

在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

比如定义一个函数,包含上述若干种参数:

2.内置函数 参考:猛击这里

注:查看详细猛击这里

1)all(iterable)函数

说明:如果iterable的所有元素不为0、''、False或者iterable为空,all(iterable)返回True,否则返回False。

1
2
3
4
5
def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

参数iterable:可迭代对象;

 

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>> all(['a''b''c''d'])  #列表list,元素都不为空或0
True
>>> all(['a''b', '', 'd'])  #列表list,存在一个为空的元素
False
>>> all([0123])  #列表list,存在一个为0的元素
False
  
>>> all(('a''b''c''d'))  #元组tuple,元素都不为空或0
True
>>> all(('a''b', '', 'd'))  #元组tuple,存在一个为空的元素
False
>>> all((0123))  #元组tuple,存在一个为0的元素
False
  
  
>>> all([]) # 空列表
True
>>> all(()) # 空元组
True

 注意:空元组、空列表返回值为True,这里要特别注意

2)any(iterable)函数

说明:如果iterable的任何元素不为0、''、False,all(iterable)返回True。如果iterable为空,返回False。函数等价于:

注意比较该函数与all()函数的区别,any是任意,而all是全部。建议比较学习两者的区别与联系。可以参考《python函数每日一讲 - all()》

 def any(iterable):

   for element in iterable:

       if  element:

           return False

   return True

参数iterable:可迭代对象;

 示例:

 >>> any(['a', 'b', 'c', 'd'])  #列表list,元素都不为空或0

True

>>> any(['a', 'b', '', 'd'])  #列表list,存在一个为空的元素

True

>>> any([0, '', False])  #列表list,元素全为0,'',false

False

>>> any(('a', 'b', 'c', 'd'))  #元组tuple,元素都不为空或0

True

>>> any(('a', 'b', '', 'd'))  #元组tuple,存在一个为空的元素

True

>>> any((0, '', False))  #元组tuple,元素全为0,'',false

False

 >>> any([]) # 空列表

False

>>> any(()) # 空元组

False

3)chr(i)函数

中文说明:

返回整数i对应的ASCII字符。与ord()作用相反。

参数x:取值范围[0, 255]之间的正数。

版本:该函数在python2和python3各个版本中都可用。不存在兼容性问题。

 

英文说明:

Return a string of one character whose ASCII code is the integer i. For example, chr(97) returns the string 'a'. This is the inverse of ord(). The argument must be in the range [0..255], inclusive; ValueError will be raised if i is outside that range. See also unichr().

 

代码实例

1
2
3
4
5
6
7
8
>>> chr(97)
'a'
>>> chr(98)
'b'
>>> ord('a')
97
>>> ord('b')
98

4)hex函数

将十进制转换为十六进制:

5)map函数

Python中的map函数应用于每一个可迭代的项,返回的是一个结果list。如果有其他的可迭代参数传进来,map函数则会把每一个参数都以相应的处理函数进行迭代处理。map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。

map(function, iterable, …)

 

有一个list, L = [1,2,3,4,5,6,7,8],我们要将f(x)=x^2作用于这个list上,那么我们可以使用map函数处理。 
  
>>> L = [1,2,3,4,] 
>>> def pow2(x): 
... return x*x 
... 
>>> map(pow2,L) 
[1, 4, 9, 16] 

再看reduce的用法。reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

比方说对一个序列求和,就可以用reduce实现:

>>> from functools import reduce
>>> def add(x, y):
...     return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25

6)函数功能将一个整数转换成8进制字符串

7)pow函数

pow() 方法返回 xy(x的y次方) 的值。

8)round函数(四舍五入)

9)zip

注意:python3与python2.7有所不同。

 10)filter函数

Python内建的filter()函数用于过滤序列。

map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

例如,在一个list中,删掉偶数,只保留奇数,可以这么写:

def is_odd(n):
    return n % 2 == 1

list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]

把一个序列中的空字符串删掉,可以这么写:

def not_empty(s):
    return s and s.strip()

list(filter(not_empty, ['A', '', 'B', None, 'C', '  ']))
# 结果: ['A', 'B', 'C']

可见用filter()这个高阶函数,关键在于正确实现一个“筛选”函数。         

11)sorted函数

排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来

>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)

['Zoo', 'Credit', 'bob', 'about']

 

                                                        

posted @ 2016-11-10 07:58  DevOps_QXW  阅读(209)  评论(0)    收藏  举报