python函数
一、函数:
创建函数:使用def语句
举例:定义一个返回斐波那楔数列列表的函数
def fibs(num):
result = [0,1]
for i in range(num-2):
result.append(result[-2]+result[-1])
print(result)
fibs(10)
>>>
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
>>>
文档化函数:对函数进行说明,写在函数开头的字符串,它会作为函数的一部分进行存储,称为文档字符串。
举例:给square()函数进行注释
def square(x):
'''calculates the square of the nmber x'''
return x*x
#使用此方法访问:
>>> square.__doc__
'calculates the square of the nmber x'
>>>
return语句:函数的返回值,起到结束函数的作用,不需要返回时,返回为None
举例:
def test():
print('pass')
return
print('nothing')
x = test()
print(x) >>>
pass
None
>>>
参数:
形参:函数名后面的变量通常叫做函数的形参;
实参:调用函数时提供的值称为实参;
说明:在函数内为参数赋值新值不会改变外部任何变量的值;
举例:
#不可变参数:字符串、数字和元组
def change(n):
n = 'zyj'
print(n) name = 'sl'
change(name)
print(name)
>>>
zyj
sl
>>> #可变参数如列表
def change(n):
n[0] = 'zyj'
print(n[0]) name = ['sl','xm']
change(name)
print(name) >>>
zyj
['zyj', 'xm']
>>> # 保留原始变量的办法:
def change(n):
n[0] = 'zyj'
print(n[0]) name = ['sl','xm']
change(name[:])
print(name) zyj
['sl', 'xm']
>>>
使用函数改变数据结构的实现举例
要求:编写一个存储名字,并且能根据条件查找对应的名字
实现:定义数据结构类型为字典,通过键值(first,second)查找对应的name。
def init(data):
'''初始化数据结构的函数'''
data['first'] = {}
data['second'] = {}
def lookup(data,lable,name):
'''查找人名相同函数'''
return data[lable].get(name)
def store(data,full_name):
'''将输入名字存储在数据库中函数'''
names = full_name.split()
if len(names) == 1:
names.insert(1, '')
labels = 'first','second'
for label,name in zip(labels,names):
peole = lookup(data,label,name)
if peole:
peole.append(full_name)
else:
data[label][name]=[full_name] >>> storage = {}
>>> init(storage)
>>> storage
{'first': {}, 'second': {}}
>>> store(storage, 'zhao yujiao')
>>> lookup(storage,'second','yujiao')
['zhao yujiao']
>>> store(storage, 'zhao qiaojiao')
>>> lookup(storage,'second','yujiao')
['zhao yujiao']
>>> storage
{'first': {'zhao': ['zhao yujiao', 'zhao qiaojiao']}, 'second': {'yujiao': ['zhao yujiao'], 'qiaojiao': ['zhao qiaojiao']}}
>>> lookup(storage,'first','yujiao')
>>> lookup(storage,'first','zhao')
['zhao yujiao', 'zhao qiaojiao']
>>> store(storage, 'song qiaojiao')
>>> storage
{'first': {'zhao': ['zhao yujiao', 'zhao qiaojiao'], 'song': ['song qiaojiao']}, 'second': {'yujiao': ['zhao yujiao'], 'qiaojiao': ['zhao qiaojiao', 'song qiaojiao']}}
>>> lookup(storage,'second','qiaojiao')
['zhao qiaojiao', 'song qiaojiao']
>>> store(storage, 'qiaojiao')
>>> storage
{'first': {'zhao': ['zhao yujiao', 'zhao qiaojiao'], 'qiaojiao': ['qiaojiao'], 'song': ['song qiaojiao']}, 'second': {'': ['qiaojiao'], 'yujiao': ['zhao yujiao'], 'qiaojiao': ['zhao qiaojiao', 'song qiaojiao']}}
关键字参数:可以明确每个参数的作用,不需要在乎参数的位置。
def hello_1(greeting,name):
print("%s,%s!" % (greeting,name))
def hello_2(name,greeting):
print("%s,%s!" % (name,greeting))
hello_1("Hello","World")
hello_1(greeting="Hello",name="World")
>>>
Hello,World!
Hello,World!
>>>
关键字参数可以在函数中给参数提供默认值,此时调用的时候可以不用提供参数,提供一些或提供所有参数
def hello_3(greeting="Hello",name="World"):
print("%s,%s!" % (greeting,name))
hello_3()
hello_3("greetings")
hello_3("greetings",'zyj')
hello_3(name='zyj')
>>>
Hello,World!
greetings,World!
greetings,zyj!
Hello,zyj!
>>>
位置参数和关键字参数结合使用
def hello_3(name,greeting="Hello",p='!'):
print("%s,%s%s" % (greeting,name,p))
hello_3("zyj")
hello_3("zyj",p='!!!')
hello_3(name='zyj')
>>>
Hello,zyj!
Hello,zyj!!!
Hello,zyj!
>>>
收集参数:参数前加星号将所有值放置在同一个元组中。一个参数里面传递多个值。
def print_params(*params):
print(params)
print_params('zyj')
print_params(1,2,3)
print_params([1],[2],[3])
print_params((1,2),(2,3))
def print_params(title,*params):
print(title)
print(params)
print_params('name:','zyj','sl','sb')
print_params('name:')
>>>
('zyj',)
(1, 2, 3)
([1], [2], [3])
((1, 2), (2, 3))
name:
('zyj', 'sl', 'sb')
name:
()
>>>
收集关键字参数:使用**,返回的是字典
def print_params(**params):
print(params)
print_params(x=1,y=2,z=3)
print_params(x=[1],y=[2],z=[3])
print_params(x=(1,2),y=(2,3))
def print_params(x,y,z=9,*params,**key):
print(x,y,z)
print(params)
print(key)
print_params(1,2,3,4,5,6,foo=1,bar=2)
print_params(1,2)
>>>
{'x': 1, 'y': 2, 'z': 3}
{'x': [1], 'y': [2], 'z': [3]}
{'x': (1, 2), 'y': (2, 3)}
1 2 3
(4, 5, 6)
{'foo': 1, 'bar': 2}
1 2 9
()
{}
>>>
参数收集的逆过程:在定义或者调用参数时使用星号或者双星号传递元组或字典。
def add(x,y):
return x+y
params = (1,2) def hello_3(name,greeting="Hello",p='!'):
print("%s,%s%s" % (greeting,name,p))
params = {'name':"zyj"} >>> add(*params)
3
>>> hello_3(**params)
Hello,zyj!
>>>
作用域:
1、局部变量:函数内部的变量
2、全局变量:具有全局作用域的变量
def foo():
x = 42
x = 1
foo()
>>> x
1
>>>
当局部变量或者参数的名字和要访问的全局变量名相同时,不能直接访问全局变量,因为全局变量将被局部变量屏蔽
解决办法:使用globals()函数获取全局变量
vars():返回全局变量的字典;
locals():返回局部变量的字典
def combine(params):
print(params+params)
params = 'zyj'
combine('hello')
def combine(params):
print(params+globals()['params'])
params = 'zyj'
combine('hello')
>>>
hellohello
hellozyj
>>>
如何改变全局变量的值:
x = 1
def change_global():
global x
x = x + 1
change_global()
>>> x
2
>>>
函数的嵌套:一般用于需要用一个函数创建另一个的时候;
说明:一个函数位于另一个里面,外层函数返回里层函数,函数本身被返回,但并没有被调用,同时返回的函数可以访问它的定义所在的作用域,来自外部作用域的变量会被内层函数访问。
类似 multiplyByFactor函数存储子封闭作用域的行为叫做闭包。
def multiplier(factor):
def multiplyByFactor(number):
return number*factor
return multiplyByFactor
>>> double = multiplier(2)
>>> double(5)
10
>>> triple = multiplier(3)
>>> triple(3)
9
>>> multiplier(5)(4)
20
>>>
递归:调用自身即函数可以调用自身
无穷递归:会导致程序崩溃或最终返回“超过最大递归深度”的错误信息提示
def foo():
return foo()
>>> foo()
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
foo()
File "C:\Users\七彩蜗牛\Desktop\抽象.py", line 2, in foo
return foo()
File "C:\Users\七彩蜗牛\Desktop\抽象.py", line 2, in foo
return foo()
......
RuntimeError: maximum recursion depth exceeded
>>>
有用的递归:递归实例,包括一个或多个问题较小部分的递归调用
使用递归实现阶乘:函数调用了fact(n)和fact(n-1)两个不同的实体。
def factorial(n):
result = n
for i in range(1,n):
result *= i
return result def fact(n):
if n == 1:
return 1
else:
return n * fact(n-1)
>>> factorial(10)
3628800
>>> fact(10)
3628800
>>>
使用递归实现幂:函数调用了p(x,n)和p(x,n-1)两个不同的实体。
def power(x,n):
result = 1
for i in range(n):
result *= x
return result
def p(x,n):
if n == 0:
return 1
else:
return x * p(x,n-1)
>>>
>>> power(2,3)
8
>>> p(2,3)
8
>>> power(3,0)
1
>>> p(3,0)
1
>>>
函数属性:
命名空间:使用句点属性标识创建不同的名字空间领域。句点属性标识对于两个模块意味不同的命名空间
def foo():
''' foo()---properly created doc string '''
def bar():
pass
bar.__doc__ = 'hello'
bar.version = 0.1
>>>
>>> help(foo)
Help on function foo in module __main__: foo()
foo()---properly created doc string >>> foo()
>>> print(foo())
None
>>> print(bar.version)
0.1
>>> print(bar.__doc__)
hello
>>> help(bar)
Help on function bar in module __main__: bar()
hello >>> bar.__doc__
'hello'
>>> bar.__dict__
{'version': 0.1}
>>> foo.__dict__
{}
>>>
python函数的更多相关文章
- python 函数之day3
一 函数的语法及特性 什么是函数? 定义:函数是一个功能通过一组语句的集合,由名字(函数名)将其封装起来的代码块,要想执行这个函数,只要调用其函数名即可. 特性: 减少重复代码 使程序变的可扩展 使程 ...
- Python函数作用域的查找顺序
函数作用域的LEGB顺序 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局作用域 B:build-in 内置作用域 2.它们 ...
- Python函数讲解
Python函数
- Python函数信息
Python函数func的信息可以通过func.func_*和func.func_code来获取 一.先看看它们的应用吧: 1.获取原函数名称: 1 >>> def yes():pa ...
- Python函数参数默认值的陷阱和原理深究"
本文将介绍使用mutable对象作为Python函数参数默认值潜在的危害,以及其实现原理和设计目的 本博客已经迁移至: http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...
- Python开发【第四章】:Python函数剖析
一.Python函数剖析 1.函数的调用顺序 #!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian #函数错误的调用方式 def fun ...
- Python函数解析
对于Python的函数,我们需要记住的是: 1. 函数的默认返回值是None. 2. python是一个自上而下逐行解释并执行的语言.因此,函数的定义必须在函数被调用之前.同名的函数,后定义的会覆盖前 ...
- Python入门笔记(18):Python函数(1):基础部分
一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/archive/2011/08/29/2153871.html 一般程序设计语言包含两种基本的抽象:过 ...
- Python函数1
Python 函数命令的使用 想想我们之前数学中学到的函数,首先我们需要定义一个函数,例如f(x)=x, 当x输入任意数的时候,f(x)都能输出和x相等的数值. 那么在Python中是如何实现的呢? ...
- python函数传参是传值还是传引用?
首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传 ...
随机推荐
- 蘑菇街TeamTalk编译连接过程中遇到的问题及解决方法(iOS)
今天浏览博文的时候,“蘑菇街开源的即时通讯框架,包括iOS.Android.Mac.Windows客户端和后台 Github源码下载地址:https://github.com/mogujie/Team ...
- [NHibernate]HQL查询
目录 写在前面 文档与系列文章 查询的几种方式 HQL查询 一个例子 总结 写在前面 上篇文章介绍了nhibernate在项目中的基本配置,包括数据库连接字符串的设置,映射文件的配置及需注意的地方,这 ...
- html用户注册界面
html用户注册界面 先上一张简约的界面的效果图 这里是style里面的内容 <style> input[type]{ border: 1px solid darkorange; ba ...
- Qt界面中嵌入其他exe程序的界面,使用Qt5
下面用一个小例子来演示如何在Qt的界面中嵌入其他exe程序的界面,最终效果如下图所示.本文参考了 http://blog.csdn.net/jiaoyaziyang/article/details/4 ...
- git 教程(15)--分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的comm ...
- Retroactive priority queues
http://erikdemaine.org/papers/Retroactive_TALG/paper.pdf 明天写..大概就是通过一些结论发现这个东西其实就是往最后的集合里加入或删除一些可以被快 ...
- source和./的区别
熟悉Linux的朋友常使用·bash·.·sh·.·source·.·.·,但却并非每位朋友都知道其中的区别.我们通过下面一幅图来为大家说明白.
- Android:联系人Contacts之ContentResolver query 参数详解
注:本片整理自 http://blog.csdn.net/wssiqi/article/details/8132603 1.获取联系人姓名 一个简单的例子,这个函数获取设备上所有的联系人ID和联系人N ...
- tensorflow的安装
binary安装(推荐) 注意需要能访问外网 Install pip (or pip3 for python3) if it is not already installed: # Ubuntu/Li ...
- Pyqt adb 获取Android手机屏幕
adb的全称为Android Debug Bridge,就是起到调试桥的作用.adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯,默认情况下adb会da ...