函数是python 为了代码最大程度的重用和最小代码冗余而提供的最基本的程序结构。使用它我们可以将复杂的系统分解为可管理的部件。

函数相关语句

def...          创建一个对象并将其赋值给某一个对象

return        将一个结果对象发送给调用者

global        声明了一个模块级的变量并赋值

nonlocal    声明了将要赋值的一个封闭的函数变量

yield          向调用者发回一个结果对象,但是记住它离开的地方

lambda      创建一个对象,将其结果返回

函数定义和调用

实例一:

 def times(x,y):     #函数定义
return x*y #函数主体 #函数调用
a = times(3,4)
b = times('hello',4)
print(a,b) #12 hellohellohellohello

实例二:求两个集合的交集

 def intersect(seq1,seq2):
res = []
for i in seq1:
for i in seq2:
res.append(i)
return res #函数调用 s1 = 'admin'
s2 = 'awsemis'
print(intersect(s1,s2)) #['a','m','i']

作用域 

  在任何情况下,一个变量的作用域(它所使用的地方)总是由在代码中被赋值的地方所决定,并且与函数调用完全没有关系。实际上,变量可以在3个不同的地方分配,分别对应3种不同的作用域:

1. 如果一个变量在def内赋值,它被定位在这个函数内。

2. 如果一个变量在一个嵌套的def中赋值,对于嵌套的函数来说,它是非本地的。

3. 如果在def之外赋值,它就是整个文件全局的。

a = 99     #a为全局变量
def num_a():
a=88 # a为本地变量(只在def语句内是可见的)
return a
print(a) #
print(num_a()) #
  尽管这两个变量名都是 a,但是它们的作用域可以把它们区别开来。实际上,函数的作用域有助于防止程序之中变量名的冲突域,并且有助于函数成为更加独立的程序单元。
作用于法则:

函数定义了本地作用域,而模块定义的是全局作用域。这两个作用域有如下的关系

1.内嵌的模块是全局作用域。

2.全局作用域的作用范围仅限于单个文件

3.每次对函数的调用都创建了一个新的本地作用域。

4.赋值的变量名除非声明为全局变量或非本地变量,否则均为本地变量

5.所有其他的变量名都可以归纳为本地、全局或者内置的。

python 的作用域的关系如下:

  变量名引用分为三个作用域进行查找:首先是本地(L),之后是函数内(E)(如果有的话),之后全局(G),最后是内置(B)。

实例:
#Global scope  全局作用域
x = 99 # x和func为全局作用域(global scope)
def func(y):
#Local scope 本地作用域
z = x + y #y和z 为本地作用域(local scope)
return z
print(func(1)) #

global语句

它是一个命名空间的声明。它告诉python函数打算生成一个或多个全局变量名。

全局变量名总结:

1. 全局变量是位于模块文件内部的顶层的变量名。

2. 全局变量如果是在函数内被赋值的话,必须经过声明。

3. 全局变量名在函数的内部不经过声明也可以被引用。

x = 88      # x 为global
def func():
global x #声明后,函数外部的变量x就会被改变。不加这个声明是不能改变外部变量的。
x = 99
func()
print(x) #

嵌套作用域实例

x = 99      #global 全局作用域
def f1():
x=88 # enclosing 函数内作用域
def f2():
print(x) #先找本地,本地找不到找函数内,遵循LEGB法则
f2() #在函数里面调用函数f2
f1() #88 #调用f1函数

nonlocal语句

  nonlocal和global一样,声明了将要在一个嵌套的作用域中修改的名称。

  区别之处:nonlocal应用于一个嵌套的函数的作用域中的一个名称,而不是所有def之外的全局模块作用域;而且在声明nonlocal名称的时候,它必须已经存在于该嵌套函数的作用域中。

参数

  必须参数

  关键字参数

  默认参数

  不定长参数(*)

  不定长参数(**)

def info(name,age,sex='男'): #sex = '男'  为默认参数(默认参数必须放后面)
print('Name:%s\nAge:%d\nSex:%s'%(name,age,sex)) '''必须参数'''
info('xp',26) '''关键字参数'''
info(age = 26,name = 'xp') info('pp',26,sex='女') '''不定长参数'''
def add(*args):
print('对元素进行求和:',args) # 传进参数打印结果是元组类型
sum=0
for i in args:
sum += i
print('求和结果:',sum) add(1,2,3) '''不定长参数二'''
def info(*args,**kwargs):
# print(args)
print(kwargs) # 打印出 字典 格式
for i in kwargs:
print('%s:%s'%(i,kwargs[i])) info('xp', 26,sex = '男',job = 'IT')
info()

  位置关系

结论:

  *args参数放在左边,**kwargs参数放在右边

 默认参数在左边,*args参数放在左边,**kwargs参数放在右边

未完待续。。。。。


Python 学习第三部分函数——第一章函数基础的更多相关文章

  1. python学习第三天第一部分

    字典 1.字典的定义和规则: 定义:{key1:value1,key2:value2} key 的定义规则:1.必须是不可变的(数字.字符串.元组):2.必须是唯一的, value的定义规则:任意类型 ...

  2. 《python学习手册》第32章 异常基础

    发生异常与默认的异常处理   当发生异常的时候,我们代码没有刻意捕获这个异常,所以它会一直向上返回到程序顶层,并启用默认的异常处理器:打印标准出错信息.而且会终止程序.   执行下面程序 def fu ...

  3. web前端学习python之第一章_基础语法(二)

    web前端学习python之第一章_基础语法(二) 前言:最近新做了一个管理系统,前端已经基本完成, 但是后端人手不足没人给我写接口,自力更生丰衣足食, 所以决定自学python自己给自己写接口哈哈哈 ...

  4. web前端学习python之第一章_基础语法(一)

    web前端学习python之第一章_基础语法(一) 前言:最近新做了一个管理系统,前端已经基本完成, 但是后端人手不足没人给我写接口,自力更生丰衣足食, 所以决定自学python自己给自己写接口哈哈哈 ...

  5. javascript进阶课程--第一章--函数

    javascript进阶课程--第一章--函数 学习要点 了解内存管理 掌握全局函数的使用 知识点 基本类型和引用类型 基本类型值有:undefined,NUll,Boolean,Number和Str ...

  6. python学习第三次记录

    python学习第三次记录 python中常用的数据类型: 整数(int) ,字符串(str),布尔值(bool),列表(list),元组(tuple),字典(dict),集合(set). int.数 ...

  7. python第一章计算机基础

    第一章 计算机基础 1.1 硬件 计算机基本的硬件由:CPU / 内存 / 主板 / 硬盘 / 网卡 / 显卡 / 显示器 等组成,只有硬件但硬件之间无法进行交流和通信. 1.2 操作系统 操作系统用 ...

  8. Python 学习 第三天 课后总结:

    PYTHON学习第三天课后总结: 1,注释:就是对代码起到说明注解的作用.   注释分为单行注释与多行注释.  单行注释:只注释一行代码在需要注释的所在行的行首使用#号来注释此行,注意#与代码之间需要 ...

  9. Python学习-第三天-面向对象编程基础

    Python学习-第三天-面向对象编程基础 类和对象 简单的说,类是对象的蓝图和模板,而对象是类的实例.这个解释虽然有点像用概念在解释概念,但是从这句话我们至少可以看出,类是抽象的概念,而对象是具体的 ...

随机推荐

  1. Spring 注解(二)注解工具类 AnnotationUtils 和 AnnotatedElementUtils

    Spring 注解(二)注解工具类 AnnotationUtils 和 AnnotatedElementUtils Spring 系列目录(https://www.cnblogs.com/binary ...

  2. SPring中quartz的配置(可以用实现邮件定时发送,任务定时执行,网站定时更新等)

    http://www.cnblogs.com/kay/archive/2007/11/02/947372.html 邮件或任务多次发送或执行的问题: 1.<property name=" ...

  3. 学习python 多进程和多线程

    ''' 学习多进程和多线程 ''' import multiprocessing def deadLoop(): while True: pass if __name__ == '__main__': ...

  4. idea maven编译jdk报错

    <!--自己添加的,用来控制maven编译时的jdk版本--> <plugins> <plugin> <groupId>org.apache.maven ...

  5. 数据分析处理库pandas及可视化库Matplotlib

    一.读取文件 1)读取文件内容 import pandas info = pandas.read_csv('1.csv',encoding='gbk') # 获取文件信息 print(info) pr ...

  6. 2018.11.06 NOIP训练 简单的计数问题(计数dp)

    传送门 直接f[i][j]f[i][j]f[i][j]表示已经到第iii个位置已经找到jjj个的方案数. 简单转移一下就行了. 代码

  7. vi三种模式的切换

    基础上vi/vim共分为三种模式,分别是命令模式,输入模式和底线命令模式. 一.命令模式 用户刚刚启动vi/vim,便进入了命令模式. 在此状态下敲击键盘动作会被vim识别为命令,而非输入字符.比如我 ...

  8. IntelliJ IDEA使用心得之Maven项目篇

    今天和大家分享下,在IDEA中打开Maven项目的方法. 对于新版的IDEA可以直接打开Maven项目,但是对于旧版的IDEA需要使用Maven命令生成项目的IDEA配置文件. 在项目的根目录(即po ...

  9. [转]深入理解mysqldump原理

    本文转至:http://blog.csdn.net/cug_jiang126com/article/details/49824471 在mysqldump过程中,之前其实一直不是很理解为什么加了--s ...

  10. HTTP 错误 404.17 - Not Found和 HTTP 错误 404.2 - Not Found 解决办法

    HTTP 404.2 - Not Found" IIS 7.5 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理 解决办法: 使用aspnet_regiis.exe注册.NET Fr ...