学习python课程第十一天

一. 命名关键字参数:

在定义函数时,*与**之间的参数就是关键字参数

特点: 在调用函数时,命名关键字参数必须按照key=value的形式传值

def func(x,*,y=1,z):

  print(x)

       print(y)

  print(z)

func(1,z=2)

def func(a,b=2,*args,c,**kwargs):
print(a)
print(b)
print(args)
print(c)
print(kwargs)

二。函数对象
函数时第一类对象:指的是函数的内存地址可以像一个变量值一样去使用
def foo(): #foo=函数的内地址
  print(‘from foo’)

1。变量值可以被引用
x=1 #foo=函数的内地址
y=x

f=foo
  print(f)
f()

2.变量值可以当做参数传给另外一个函数
def bar(x):
  print(x)
  x()
x=11111 #foo=函数的内存地址
bar(x)
bar(foo)

3.变量值可以当做函数的返回值
def func(x):
  return x
f= func(foo)
print(f)

4.变量值可以当做容器类型的元素
1=[foo,]
print(1)
1[0]()
#在后面加上括号就可以调用函数了.

dic={'1':foo}
print(dic)
dic['1']()


三.函数的嵌套:

函数的嵌套调用: 在一个函数内部又调用其他函数
def max2(x,y):
  if x > y:
    return x
  eles:
    return y
def max4(a,b,c,d):
  res1=max2(a,b)
  res2=max2(res1,c)
  res3=max2(res2,d)
  return res3
print(max4(1,2,3,4))


函数的嵌套定义: 在函数内有定义了其他函数

def func():
  def foo():
    print('from foo')
  #print(foo)
  foo()
  x=1
  print(x)
func()

求圆的周长跟面积的方式:

from math import pi

def circle(radius,action):
def cal_perimeter():
return 2 * pi * radius

def cal_area():
return pi * (radius ** 2)

if action == 1:
res=cal_perimeter()
elif action == 2:
res=cal_area()
return res

res=circle(10,1)
print(res)

四.名称空间与作用域:

1,名称空间相关
名称空间namespaces:指的是存放名字与值内存地址绑定关系的地方,(内存空间)
x=1

2.名称空间分为三大类:
内置名称空间:存放的是python解释器自带的名字
产生:python解释器的启动则产生
销毁:python解释器关闭则销毁。

全局名称空间:在*定义的名字。(前面没有缩进)
x1
if True:
  y=2
while True:
  while True:
    while True:
      z=3
(因为if 跟 while后面的变量可以写在一行)

产生:执行python程序时产生
销毁:python程序执行完毕后则销毁


局部名称空间:在函数内定义的名字
def foo():
  m=100
foo()

产生:在函数调用的时候临时产生
销毁:在函数调用完毕后则销毁

三种名称空间的产生的先后顺序:内置-》全局-》局部
查找名字的顺序:从当前位置往外一层一层的找
  如果当前在局部名称空间: 局部-》全局-》内置
  如果当前在全局名称空间: 全局-》内置


示例:
len=111
def foo():
# len=222
print(len)
len=111
foo()
x=0
def f1():
# x=1
def f2():
# x=2
def f3():
# x=3
print(x)
f3()
f2()
f1()


def foo1():
def foo2():
def foo3():
print(x)

2. 作用域:指的是作用的范围
全局作用域:包含内置与全局名称空间的名字
  特点:全局存活,全局有效。
局部作用域:包含局部名称空间的名字
  特点:临时存活,局部有效


终极无敌之天打五雷轰之上帝视角之霸王硬上弓之重点之重点!!!!!!!!
作用域关系是在函数定义阶段就已经固定死了,与调用位置无关!!!!!!!

示例:
def f1():
print(xxx)
xxx=111

def f2():
xxx=222
f1()

f2()


xxx=111
def f1():
print(xxx)
# xxx=222
yyy=222
print(yyy)

f
五。闭包函数。
闭:封闭,指的是该函数是定义一个函数内部的函数
包:该内部函数包含对外层函数名字的引用(alex在集装箱里吃蛋糕,就是闭包函数)


def outter():
  x=1
  def inner():
    print(‘from inner’,x)
  return inner

f = outter()
(也就是说f = inner)

def foo():
  print(f)
  x=11111111111
  f()
foo()


为函数体传值的两种方式:
def foo():
  print(‘hello %s’%name)

方式一:直接以参数的形式传入
def foo(name):
  print(‘hello%s’%name)

foo(‘egon’)

(这种方式确实可以。但是太麻烦,用的多了就不好修改了。)

方式二:闭包函数

def outter(name):
#name='egon'
def foo():
print('hello %s' %name)
return foo

f=outter('egon')
print(f)
f()
f()
f()

f1=outter('alex')
f1()
f1()
f1()
(这种方式可以随意的修改多次使用的函数的值。)


爬虫的闭包用法
pip3 install requests
import requests

问题
def get():
response=requests.get(url)
if response.status_code == 200:
print(response.text)

解决方案一:
def get(url):
response=requests.get(url)
if response.status_code == 200:
print(response.text)

get('https://www.baidu.com')
get('https://www.baidu.com')
get('https://www.baidu.com')

解决方案二:
def outter(url):
# url='https://www.baidu.com'
def get():
response=requests.get(url)
if response.status_code == 200:
print(response.text)
return get

baidu=outter('https://www.baidu.com')
cnblogs=outter('https://www.cnblogs.com')