zoukankan      html  css  js  c++  java
  • 函数参数

    1.函数参数的传递规则,先按位置传递参数,再按照关键字传递参数。


    #站在实参的角度上:
    #按照位置传参
    #按照关键字传参
    #混着用可以:但是 必须先按照位置传参,再按照关键字传参数
    # 不能给同一个变量传多个值

    #站在形参的角度上
    #位置参数:必须传,且有几个参数就传几个值
    #默认参数: 可以不传,如果不传就是用默认的参数,如果传了就用传的

    #只有调用函数的时候
    #按照位置传 : 直接写参数的值
    #按照关键字: 关键字 = 值

    #定义函数的时候:
    #位置参数 : 直接定义参数
    #默认参数,关键字参数 :参数名 = '默认的值'
    #动态参数 : 可以接受任意多个参数
    #参数名之前加*,习惯参数名args,
    #参数名之前加**,习惯参数名kwargs
    #顺序:位置参数,*args,默认参数,**kwargs

    # 动态参数有两种:可以接受任意个参数
    #*args : 接收的是按照位置传参的值,组织成一个元组
    #**kwargs: 接受的是按照关键字传参的值,组织成一个字典
    #args必须在kwargs之前

    def func(b,a):
        
        print(a,b)
    
    func(b=2,a = 1)
    
    
    
    def func(a,b):
        print('%s,%s'%(a,b))
    
    func('等等','水电费')    
    
    
    def func(*args):
        print(args)
    
    func(1,2,[1,2])
    
    def func(**kwargs):
        print(kwargs)
    
    func(a = 1,b =2)    
    
    
    
    def func(*args):
        print(args)
    
    li = [1,2]
    func(*li)    
    
    
    def func(**kwargs):
        print(kwargs)
    
    li = {'a':1,'b':2}
    func(**li)    
    View Code

    2.这两天困扰我的一个问题,安装pycharm没有选中jre时候显示没有安装JDK,安装了1.7的JDK后,又显示could not find main class com/intellij/idea/Main。

    后来在网上查找资料发现以下解决方法:

    1.应该是是JDK 的版本太低,我的从1.7升级到1.8就解决问题了。

    2.官网oracle下载JDK1.8安装包后,按照正常步骤安装,然后修改环境变量如下:

    (1)新建->变量名"JAVA_HOME",变量值"C:Javajdk1.8.0_05"(即JDK的安装路径) 
    (2)编辑->变量名"Path",在原变量值的最后面加上“;%JAVA_HOME%in;%JAVA_HOME%jrein” 
    (3)新建->变量名“CLASSPATH”,变量值“.;%JAVA_HOME%lib;%JAVA_HOME%libdt.jar;%JAVA_HOME%lib ools.jar”

    详细情况可参考我的百度账号,我的经验收藏的一篇文章

    最后成功了,开心。

     3.一些小练习

    #列表转换为字符串
    # li = ['dfd', 'afe', 'd']
    # print(''.join(li))
    #字符串转换列表
    # s = 'skdlffsf'
    # print(s.split('l',1))
    
    #倒着打印100-0
    '''
    for i in range(100,-1,-1):
        print(i)
    '''
    
    
    # def func(a,b):
    #     print('%s,%s' % (a, b))
    #
    # func(1,2)
    
    
    s=input('>>>')
    li = []
    for i in s:
        print(i)
        if  i.isdigit() :
            if int(i) % 2 == 1:
                li.append(i)
    
    
    print(len(li))
    View Code
    dic={'最终计算结果':None}
    dic={}
    content = input('请输入内容:')
    s = content.split('+')
    sum = 0
    for i in s:
       sum += int(i)
    dic['最终计算结果'] = sum
    print(sum,dic)
    

    4.昨天的2道练习题目

    # import os
    # with open('ss', mode='r+', encoding='utf-8"') as f, open('ssss', 'w',encoding = 'utf-8') as f1:
    #    for i in f:
    #      if 'alex' in i:
    #         i = i.replace('alex', 'sb')
    #      f1.write(i)
    #
    # os.remove('ss')
    # os.rename('ssss','ss')
    
    
    # apple 10
    # tesla 100000 1
    # mac 3000 2
    # lenovo 30000 3
    # chicken 10 3
    li = []
    with open('aa',mode='a+',encoding='utf-8') as f:
        f.write('apple 10 3
    ')
        f.write('tesla 100000 1
    ')
        f.write('mac 3000 2
    ')
        f.write('lenovo 30000 3
    ')
        f.write('chicken 10 3
    ')
        f.seek(0)
        for i in f:
           s = i.split()
           dic = {'name':s[0],'price':s[1],'account':s[2]}
           li.append(dic)
    
    print(li)
    View Code

     5.函数的参数

    # def 深圳():
    #     print('欢迎你')
    # 深圳()
    
    def func(l = []):
        l.append(1)
        print(l)
    func()
    func([])
    func()
    View Code

    6.函数的命名空间和作用域

    在这里我们首先回忆一下python代码运行的时候遇到函数是怎么做的。

    从python解释器开始执行之后,就在内存中开辟了一个空间

    每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来。

    但是当遇到函数定义的时候解释器只是象征性的将函数名读入内存,表示知道这个函数的存在了,至于函数内部的变量和逻辑解释器根本不关心。

    等执行到函数调用的时候,python解释器会再开辟一块内存来存储这个函数里的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量会存储在新开辟出来的内存中。函数中的变量只能在函数的内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。

    我们给这个“存放名字与值的关系”的空间起了一个名字——叫做命名空间

    代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间,在函数的运行中开辟的临时的空间叫做局部命名空间

    命名空间 有三种

    #内置命名空间 —— python解释器
    # 就是python解释器一启动就可以使用的名字存储在内置命名空间中
    # 内置的名字在启动解释器的时候被加载进内存里
    #全局命名空间 —— 我们写的代码但不是函数中的代码
    # 是在程序从上到下被执行的过程中依次加载进内存的
    # 放置了我们设置的所有变量名和函数名
    #局部命名空间 —— 函数
    # 就是函数内部定义的名字
    # 当调用函数的时候 才会产生这个名称空间 随着函数执行的结束 这个命名空间就又消失了

    #在局部:可以使用全局、内置命名空间中的名字
    #在全局:可以使用内置命名空间中的名字,但是不能用局部中使用
    #在内置:不能使用局部和全局的名字的

    作用域

    作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。

    全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效

    局部作用域:局部名称空间,只能在局部范围生效

    # def sum(a,b):
    #     print(a if a>b else b)
    # sum(1,2)
    
    # def input():
    #     print(1)
    # def func():
    #     input = 1
    #     print(input)
    # func()
    
    
    # globals和locals方法
    # c = 10
    # d = 13
    # def func():
    #     a=12
    #     g = 23
    #     f = 88
    #     b = 13
    #     print(locals())
    #     # print(globals())
    # func()
    #print(locals())#globals 永远打印全局的名字
    #print(globals())#locals 输出什么 根据locals所在的位置
    
    #global关键字
    # a = 10
    # def func():
    #     global a
    #     a = 12
    #
    # print(a)
    # func()
    # print(a)
    
    # global a
    # a = 10
    # def func():
    #     # a = 12
    #     print(a)
    #
    #
    # print(a)
    # func()
    # print(a)
    View Code

    7.不通过global 在局部作用域修改全局变量

    a = 10
    def func():
        a = 20
        return a
    a = func()
    print(a)
    View Code

    8.函数的嵌套和作用域链

    #函数的嵌套调用
    # def max2(x,y):
    #     m = x if x>y else y
    #     return m
    # def max4(x,y,z,w):
    #     c = max2(x,y)
    #     d = max2(z,w)
    #     return max(c,d)
    # print(max4(1,5,3,4))
    
    #函数的嵌套定义
    
    # def f1():
    #     print(1)
    #     def f2():
    #         print(2)
    #     f2()
    # f1()
    #函数的作用域链
    # def f1():
    #     a = 1
    #     def f2():
    #         global a#只修改了全局变量,上面的局部变量没有修改
    #         a = 2
    #         print(a)
    #     f2()
    #     print(a)
    # f1()
    # print(a)
    
    #nonlocal关键字和global的区别
    #nonlocal 只能用于局部变量 找上层中离当前函数最近一层的局部变量
    #声明了nonlocal的内部函数的变量修改会影响到 离当前函数最近一层的局部变量
    # 对全局无效
    # 对局部 也只是对 最近的 一层 有影响
    # a=1
    # def f1():
    #     a = 1
    #     def f2():
    #         nonlocal a#只修改了全局变量,上面的局部变量没有修改
    #         a = 2
    #         print(a)
    #     f2()
    #     print(a)
    # f1()
    # print(a)
    View Code

    9.函数名的本质

    #函数名的本质
    #函数名本质上就是函数的内存地址
    #1.可以被引用
    # def func():
    #     print(1)
    # f = func
    # print(f)
    #2.可以被当作容器类型的元素
    # def f1():
    #     print('f1')
    # def f2():
    #     print(f2)
    # def f3():
    #     print(f3)
    # l = [f1,f2,f3]
    # l[0]()
    #3.可以当作函数的参数和返回值
    #就当普通变量用
    
    def func():
        print(123)
    def wahaha(f):
        f()
        return f           #函数名可以作为函数的返回值
    qqxing = wahaha(func)   # 函数名可以作为函数的参数
    qqxing()
    View Code

    10.闭包

    闭包函数:

    内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数
    #函数内部定义的函数称为内部函数

    由于有了作用域的关系,我们就不能拿到函数内部的变量和函数了。如果我们就是想拿怎么办呢?返回呀!

    我们都知道函数内的变量我们要想在函数外部用,可以直接返回这个变量,那么如果我们想在函数外部调用函数内部的函数呢?

    是不是直接就把这个函数的名字返回就好了?

    # name = 'chun'
    # def func():
    #     name = 'shang'
    #     def inner():
    #         print(name)
    #     # inner()
    # func()
    
    # def func():
    #     name = 'shang'
    #     def inner():
    #         print(name)
    #     return inner
    # f = func()
    # f()
    
    #判断闭包函数的方法__closure__
    
    #输出的__closure__有cell元素 :是闭包函数
    # def func():
    #     name = 'shang'
    #     def inner():
    #         print(name)
    #     print(inner.__closure__)
    #     return inner
    # f = func()
    # f()
    #输出的__closure__为None :不是闭包函数
    #
    name = 'shang'
    # def func():
    #
    #     def inner():
    #         print(name)
    #     print(inner.__closure__)
    #     return inner
    # f = func()
    # f()
    #闭包嵌套
    # def wrapper():
    #     money = 1000
    #     def func():
    #         name = 'eva'
    #         def inner():
    #             print(name,money)
    #         return inner
    #     return func
    #
    # f = wrapper()
    # i = f()
    # i()
    
    #闭包函数获取网络应用
    from urllib.request import urlopen
    
    def index():
        url = "http://www.xiaohua100.cn/indexhtml"
        def get():
            return urlopen(url).read()
        return get
    xiaohua = index()
    content = xiaohua()
    print(content)
    View Code


     

    
    
  • 相关阅读:
    第一阶段冲刺(6)--每日立会--个人工作总结
    第一阶段冲刺--每日立会(5)--个人工作总结
    第一阶段冲刺--每日立会(4)--个人工作总结
    第十一周学习记录表
    第一阶段冲刺--每日立会(3)个人工作总结
    第一阶段冲刺--每日立会(2)--个人工作总结
    第一阶段冲刺--每日立会(1)--个人工作总结
    第十周学习记录表
    第九周学习进度表
    输入法
  • 原文地址:https://www.cnblogs.com/shangchunhong/p/9219975.html
Copyright © 2011-2022 走看看