【12】Python函数学习(中)

作用域、局部和全局变量

前向引用:

def test(name,age=18,*args,**kwargs):  
    print(name)
    print(age,args,kwargs)
    school("Test")   #程序执行从上到下的,这里的school还没定义,所以执行报错。
test(‘alex‘,age=20,flag="F",water=1.5)

def school(source):
    print(source)

运行结果:

报错NameError: name ‘school‘ is not defined

正确写法:

def test(name,age=18,*args,**kwargs):
    print(name)
    print(age,args,kwargs)
    school("Test")

def school(source):
    print(source)

test(‘alex‘,age=20,flag="F",water=1.5)

运行结果:

alex

20 () {‘flag‘: ‘F‘, ‘water‘: 1.5}

Test

局部变量(只在函数里生效,这个函数就是这个变量的作用域)

def logers(name):
    print(‘before change:‘,name)
    name=‘ALEX‘
    print(‘after change:‘,name)
    age=23

name=‘alex‘
logers(name)
print(name)

print(age)  #这里报错,NameError: name ‘age‘ is not defined,,age属于局部变量,只能在局部生效。

运行结果:

before change: alex

after change: ALEX

alex

全局变量(在顶层,第一级定义的变量都是全局变量)

school=‘Oldboy‘   #顶层定义全局变量
def logers(name):
    school="Mage"  #局部变量
    print(‘before change:‘,name,school)
    name=‘ALEX‘
    print(‘after change:‘,name)
    age=23

name=‘alex‘
logers(name)
print(name)
#print(age)
print(school)

运行结果:

before change: alex Mage  #局部变量优先,虽然内部变了,但是全局变量还是没变。

after change: ALEX

alex

Oldboy  #全局变量

改全局变量

不要这么用1:

school=‘Oldboy‘
def logers(name):
    global school  #我要把函数的全局变量改了
    school="Mage"
    print(‘before change:‘,name,school)
    name=‘ALEX‘
    print(‘after change:‘,name)
    age=23

name=‘alex‘
logers(name)
print(name)
#print(age)
print(school)

运行结果:

before change: alex Mage

after change: ALEX

alex

Mage

总结:

  1. 局部变量的作用域只在子程序(函数)中有效

    2、全局变量的作用域在整个程序

    3、全局变量配置在程序最顶层

    4、需要把全局变量改为局部变量那就用global 变量名(不要那么用)

    不要这么用2:(作死)

def student():
    global name  #这个作用是把 name定义为全局变量
    name=‘alex‘

student()
print(name)

为啥:容易混乱程序(找bug找死你)

递归:(在函数内部可以调用自己)

1.必须要有明确的结束条件

2.每次进入更深一层的时候,问题规模应该比上一层要小

3.递归效率不高,递归层次过多会导致栈溢出。(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减少一层栈帧。由于栈的大小不是无限的,所以递归次数过多会导致栈溢出。)

def calc(n):   #程序开始,取calc实参
    print(n)  #打印判断结果
    if int(n/2) >0 : 
        return calc(int(n/2)) #递归
    print(‘>>>‘,n)
calc(10)

运行结果:

10

5

2

1

>>> 1

函数式编程介绍:

函数式编程是一种抽象程度很高的编程范式,纯粹的函数式编程语言的编写没有变量。因此,任意一个函数,只要输入确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此这种函数是有副作用的。

函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数。

Python对函数式编程提供部分支持,由于python允许使用变量,因此,python不是纯函数式编程语言。

想学函数式编程可以学lisp、hashshell、erlang

高阶函数:

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就叫做高阶函数。

def add(a,b,f):
    return f(a)+f(b)

res=add(3,-6,abs)  #abs 绝对值的意思
print(res)

结果:

9

时间: 2024-08-03 01:46:01

【12】Python函数学习(中)的相关文章

[python 函数学习篇]默认参数

python函数: 默认参数: retries=4 这种形式 def ask_ok(prompt, retries=4, complaint='Yes or no, please!'): while True: ok = raw_input(prompt) if ok in ('y', 'ye', 'yes'): return True if ok in ('n', 'no', 'nop', 'nope'): return False retries = retries - 1 if retri

Python函数学习-参数类型

函数的参数 在定义Python函数时可定义形参,这些参数在调用时候才能确定具体的值,由函数的调用者负责为行参传入参数值 函数的参数类型 一. 位置参数 也叫必传参数,顺序参数,是最重要的,也是必须在调用函数时明确提供的参数!位置参数必须按先后顺序,一一对应,个数不多不少的传递! 说明:a,b,c是函数add的行参,没有具体的值,只有在add(x,y,z)是才被传入值,a=x=1,b=y=2,c=z=3, 其中x,y,z叫做实参,add(4,5,6,7),add(5,7)均为错误调用 二.关键字参

pythonの函数学习笔记(一)

函数是可以实现一些特定功能的小方法或小程序定义函数function的方法:def function_name(arg1,arg2[,...]): statement [return value]注意事项:1.def开头,代表定义函数,def和函数名中间要敲一个空格:2.返回值不是必须的,如果没有renturn语句,则默认返回值None:3.函数名必须以下划线或字母开头,可以包含任意字母.数字或下划线的组合,区分大小写且不能是保留字: py使用名称空间的概念存储对象,这个名称空间就是对象作用的区域

【11】Python函数学习(一)

本文主要介绍python函数,也就是函数式编程的用法. 何为函数: 函数是组织好的,可重复使用的,用来实现单一,或相关功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道python提供许多内建函数,比如print().但你也可以自己创建函数,这被叫做用户自定义函数. 规范: 面向对象  >>>>>> 类  >>>>>>class 面向过程  >>>>>> 过程 >>&

12 Python 函数

初识函数定义与调用 定义:def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":". def 是固定的,不能变,必须是连续的def三个字母,不能分开...它们要相亲相爱的在一起. 空格 为了将def关键字和函数名分开,必须空(四声),当然你可以空2格.3格或者你想空多少都行,但正常人还是空1格. 函数名:函数名只能包含字符串.下划线和数字且不能以数字开头.虽然函数名可以随便起,但我们给函数起名字还是要尽量简短,并能表达函数功能 括号:是必须加的,先别问为啥要有括号,总之加

python初步学习中的问题之HTTP status code is not handled or not allowed

按照网上的教程学习python,最开始的dmoz_spider项目一直不能正常运行,一直出现下面的问题: 即http status code is not handled or allowed http状态代码没有被处理或允许, 一开始我不理解,在网上找了好多修改setting.py中的 DOWNLOADER_MIDDLEWARES方法也没啥用,心疼自己英语太差,好多问题看不懂... 不过最后还是找到了修改方法: 就是你的http状态码没有被识别,需要在settings.py中添加这个状态码信息

python程序学习中

python 网站,尤其是百度这一块大多基于2.0,想学习思路或者处理方式,都要写2.0的,然后在3.5的各种报错,为了更好的重整框架,一些语言是不支持向上兼容的,这也是一个好事 慢慢的你在了解语言的调整,你跟着去修改你的程序,慢慢的就会熟悉掌握很多东西 我就很享受去体会这种差异,给变成人生带来一种思考的跨越,当然是体会别人思考的跨越,为何会这样更改,我们在学习阶段,没有理由去怀疑别人,全盘接受.就像钢琴,在初级阶段,你必须保持良好的手型,你看大师,好像没有手型,你很羡慕,其实呢,能在告诉移动中

python基础学习中发现的一些小知识

1.abs()函数 >>> abs(-1) 1 >>> abs(1+2j) 2.23606797749979 abs函数常用返回绝对值,而复数使用abs则返回(a+bj)中a与b平方和再取平方根,如上所示 2.pow()与math.pow()函数 >>> pow(1,2) 1 >>> pow(2.0,3) 8.0 >>> pow(2,3.0) 8.0 >>> pow(2.0,3.0) 8.0 >

Python多线程学习(中)

今天接着写多线程,最近几天一直在看多线程,但是书上的例子太难看了(可能我天生愚笨吧-_-),看了好久才搞懂,我看了两本书才搞明白书上的例子,所以大家在看书学习看不懂的时候,推荐多看几本一样知识点的书,在网上多看教程,辅助学习. 下面开始介绍锁和条件变量. 一."锁" 锁是指在运行程序时,对于需要访问共享资源的多线程程序,为防止I/O密集型操作造成结果发生错误. 使用锁的方法:  import threading 引入锁 lock = threading.Lock() 添加锁  lock