一、函数的定义和调用

  为什么要用函数:例如,计算一个数据的长度,可以用一段代码实现,每次需要计算数据的长度都可以用这段代码,如果是一段代码,可读性差,重复代码多;

          但是如果把这段代码封装成一个函数,用的时候直接调用,一是简洁明了,二是节省代码量

  定义函数:def 函数名():函数体  调用函数:函数名()

  写函数的时候,要尽量以功能为导向,结果最好不要直接在函数打印

def func(para):
count = 0
for i in para:
count += 1
return count
a = func('1232ffsdfsdfwe') #调用函数
print(a) #

二、函数的返回值

  函数的返回值用return

  1.没有返回值:不写return == return None,默认返回None

           只写一个return == return None

             return的作用:1.返回一个值  2.终止一个函数的继续

  2.返回一个值:可以返回任意的数据类型,返回什么,就接收什么

  3.返回多个值:用一个变量接收返回值,接收到的是一个元组

           返回值用多个变量接收,那么返回值的个数应该和接收变量的个数完全一致

三、函数的参数

  传递参数:简称传参,是在调用函数时输入的参数传递到函数中(可以传递多个参数)(对于一个参数只能赋值一次)

  实际参数:简称实参,调用函数时输入的函数称为实参;

  形式参数:简称形参,定义函数的时候输入的参数称为形参

def func(para):  #p形参:ara
count = 0
for i in para:
count += 1
return count
a = func('asd') #实参:asd
print(a)

  位置参数:1.按照位置传参

       2.按照关键字传参

       3.按照位置、关键字混合着传参,混合传参必须把位置参数写在前面,否则会报错

def f2(arg1,arg2):   #站在接受、形参的角度上:位置参数
print(arg1,arg2)
f2(123,'abc') #123 abc (按位置传参)
f2(arg2=123,arg1='abc') #abc 123 (按关键字传参)
f2(123,arg2='abc') #123 abc(混合传参)

  默认参数:将变化比较小的值变成默认参数

  特点:可以不传的参数;在不传参数的情况下可以使用默认的值;如果传了,就会使用传的值

     默认参数尽量避免使用可变数据类型

def func(name,sex='man'):  #man是默认参数
print(name,sex)
func('abc')
li = []
def func(para):
li.append(para)
print(li)
func('abc') #['abc']
func('abc') #['abc', 'abc']

  动态函数:顺序:位置参数,*args,默认参数,**kwargs

       *args:可以接收多个按位置传参,以元组的方式接收

       **kwargs:可以接收多个关键字传参,以字典的方式接收

def func1(*args):
print(args)
func1(1,2,3,4) #(1,2,3,4) def func2(**kwargs):
print(kwargs)
func2(a=1,b=2) #{'a':1,'b':2}

  动态参数的魔性用法:在调用函数的时候,对于实参:*的作用是将一个实参中的每一个元素作为一个参数传到形参数

                         :**的作用是将实参中的字典变成a = b的形式传到形参

def func1(*args):
print(args)
a = ''
b = [1,2,3,4,5]
func1(*a) #('1','2','3','4','5')
func1(*b) #(1,2,3,4,5) def func2(**kwargs):
print(kwargs)
a = {'a':1,'b':2}
func2(**a) #{'a':1,'b':2}

四、函数的命名空间

  全局命名空间:写在函数外面的变量名

  局部命名空间:写在函数内部的变量名

  内置命名空间:python解释器启动之后就能使用的名字

  加载顺序:先加载所有内置命名空间中的名字,然后按顺序加载全局命名空间中的名字

  局部命名空间的名字:在调用函数的时后产生,并且随着调用的结束而消失

  内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

五、函数的作用域

  作用域:一个名字可以使用的区域

  全局作用域:内置命名空间和全局命名空间的名字都属于全局作用域

  局部作用域:局部命名空间中的名字属于局部作用域

  局部作用域可以使用全局作用域的变量,而全局作用域不能使用局部作用域的变量

  局部作用域还可以嵌套更小的局部作用域

  作用域链:小范围作用域可以使用大范围的作用域,但作用域链是单向的,不能反向应用

  globals和locals的用法:

    小范围可以使用大范围的,但不能修改

    如果想要修改全局的,使用global关键字  —— 尽量避免

    如果想要最近拥有该变量的外层函数,使用nonlocal  —— 不影响全局

六、函数的名字

  第一类对象:函数名可以赋值

          可以作为一个数据结构的元素

        可以作为一个函数的参数

        可以作为一个函数的返回值

七、闭包

  内部函数引用了外部函数的变量

  闭包函数:内部函数对外部作用域而非全局作用域的名字的引用。  #函数内部定义的函数称为内部函数

def func():
def inner():
print(123)
return inner f = func() #f = inner
f() #==>innner()

  判断闭包函数的方法:__closure__,输出的__closure__有cell元素是闭包函数,输出的__closure__为None,不是闭包函数

def func():
a = 1
def inner():
print(a)
print(inner.__closure__)
return inner func() #(<cell at 0x00000177528655E8: int object at 0x00000000574760E0>,) a =1
def func2():
def inner():
print(a)
print(inner.__closure__)
return inner func2() #None

  闭包函数获取网路应用

from urllib.request import urlopen  #导入模块

def get_url():
def inner(url):
return urlopen(url).read() #返回网站内容
return inner g = get_url()
ret = g('http://www.baidu.com')
print(ret)
# 因为如果用 urllib.request.urlopen 方式打开一个URL,服务器端只会收到一个单纯的对于该页面访问的请求,但是服务器并不知道发送这个请求使用的浏览器,操作系统,硬件平台等信息,而缺失这些信息的请求往往都是非正常的访问,例如爬虫.
# 有些网站为了防止这种非正常的访问,会验证请求信息中的UserAgent(它的信息包括硬件平台、系统软件、应用软件和用户个人偏好),如果UserAgent存在异常或者是不存在,那么这次请求将会被拒绝(如上错误信息所示)
# 所以可以尝试在请求中加入UserAgent的信息
# 解决方法:在请求中添加UserAgent的信息,代码如下
#如果不加上下面的这行出现会出现urllib2.HTTPError: HTTP Error 403: Forbidden错误
#主要是由于该网站禁止爬虫导致的,可以在请求加上头信息,伪装成浏览器访问User-Agent,具体的信息可以通过火狐的FireBug插件查询
from urllib import request
def get_url(chaper_url):
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
req = request.Request(url=chaper_url, headers=headers)
return request.urlopen(req).read()

Python 3.x 中"HTTP Error 403: Forbidden"问题的解决方案

Python学习(六) —— 函数的更多相关文章

  1. python学习8—函数之高阶函数与内置函数

    python学习8—函数之高阶函数与内置函数 1. 高阶函数 a. map()函数 对第二个输入的参数进行第一个输入的参数指定的操作.map()函数的返回值是一个迭代器,只可以迭代一次,迭代过后会被释 ...

  2. python学习7—函数定义、参数、递归、作用域、匿名函数以及函数式编程

    python学习7—函数定义.参数.递归.作用域.匿名函数以及函数式编程 1. 函数定义 def test(x) # discription y = 2 * x return y 返回一个值,则返回原 ...

  3. 从0开始的Python学习007函数&函数柯里化

    简介 函数是可以重用的程序段.首先这段代码有一个名字,然后你可以在你的程序的任何地方使用这个名称来调用这个程序段.这个就是函数调用,在之前的学习中我们已经使用了很多的内置函数像type().range ...

  4. python学习Day10 函数的介绍(定义、组成、使用)

    今日学习内容: 1.什么是函数 :函数就是一个含有特定功能的变量,一个解决某问题的工具 函数的定义:通过关键字def + 功能名字():代码体(根据需求撰写代码逻辑) 2.为什么要用函数:可以复用:函 ...

  5. Python学习之函数参数

    上一节,我们学习了Python中是如何定义和调用函数且如何得到返回值的.在调用函数时,有的函数需要参数来启动函数,有的则无需参数.这一节我们来介绍Python中有哪些参数类型. 位置参数 在调用函数时 ...

  6. Python学习笔记 - 函数参数

    >>> def power(x): ... return x * x ... >>> power(5) 25 >>> def power(x, n ...

  7. Python学习笔记—函数

    函数 我们知道圆的面积计算公式为: S = πr2 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需要计算3个不同大小的圆的面积: r1 = 12.34 r2 = 9.08 r3 = 73 ...

  8. Python学习之函数篇

    python查看对象,函数帮助文档:.__doc__,例:str.split.__doc__ 查看详细对象,函数文档:help(),例:help(str.split) 函数参数可设置默认值 如果不能提 ...

  9. Python学习--05函数

    Python函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.我们已经知道Python提供了许多内建函数,比如print().但我们 ...

  10. python学习:函数的学习

    我们写东东的时候,往往有一些东西要频繁去复用,那么每个功能是10行代码,复用2次就是20行,这样看来我们的程序如果频繁利用某些代码的话,那么会是我们开发的东西越来越臃肿.那么好的方法有没有呢,那就是函 ...

随机推荐

  1. Laravel - Union + Paginate at the same time? and another problem----1222 The used SELECT statements have a different number of columns (SQL: (select count(*) as aggregate from

    ### 这是这几天,碰到的一个比较头疼的问题 使用union all联合查询,同时laravel 生成分页,但发生报错? QueryException : SQLSTATE The used from ...

  2. C# 制作向导

    1.FormBase界面:有“帮助,上一步,下一步,取消”按钮,这些按钮放置在一个Panel上. namespace DataBase {     public partial class FormB ...

  3. iOS -- Effective Objective-C 阅读笔记 (2)

    1: 多用类型常量, 少用 #define 预处理指令 #define 预处理指令会把碰到的所有 指定名称 一律换位 定义的内容, 这样的话, 假设此指令在某个头文件中, 那么所有引入这个头文件的代码 ...

  4. Confluence 6 为搜索引擎隐藏外部链接

    为搜索引擎隐藏外部链接能够避免向你的站点添加垃圾信息.如果你启用了这个选项的话,任何插入到页面中的 URLs 和评论将会赋予 'nofollow' 属性,这个属性将会禁止搜索引擎进行索引.  快捷链接 ...

  5. Confluence 6 你模板中可用的对象

    包含宏正文和参数,下面的 Confluence 对象在宏中可用: $body 宏的正文(如果宏有正文的话) String $paramfoo, $parambar, ...$param<name ...

  6. 图片文字css小知识点

    行内元素,图片和文字中间有缝隙,需要给父元素设置font-size:0: 图片和文字不对齐,给图片设置vertical-align:top 文字行高有缝隙 设置vertical-align:top  

  7. (七)STL适配器

    1.适配器是稍微修改某些功能,比如三个参数改为两个参数,函数的名称改一下等等,可以出现在容器.迭代器和仿函数中. 2.适配器相当于对某个东西进行封装,例如A是B的适配器,则真正的功能实现是在B中,可以 ...

  8. Solver Of Caffe

    本文旨在解决如何编写solver文件. Solver的流程: 1.     设计好需要优化的对象,以及用于学习的训练网络和用于评估的测试网络.(通过调用另外一个配置文件prototxt来进行) 2.  ...

  9. Eclipse搭建.C#和..NET Core环境

    1.在上一篇博客中我介绍了如何使用Eclipse搭建C++.C开发环境,顺带把搭建 .NET Core 和C#也做个介绍.配置任何环境关键是找到要开发语言的编辑器和SDK.eclipse是java开发 ...

  10. Allegro PCB Design GXL (legacy) 手动更改元器件引脚的网络

    Allegro PCB Design GXL (legacy) version 16.6-2015 1.菜单:Setup > User Preferences... 2.User Prefere ...