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:\Java\jdk1.8.0_05"(即JDK的安装路径) 
(2)编辑->变量名"Path",在原变量值的最后面加上“;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin” 
(3)新建->变量名“CLASSPATH”,变量值“.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.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\n')
    f.write('tesla 100000 1\n')
    f.write('mac 3000 2\n')
    f.write('lenovo 30000 3\n')
    f.write('chicken 10 3\n')
    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

 



 

 

 


posted on 2018-06-24 19:30  快叫洪哥  阅读(305)  评论(0编辑  收藏  举报