python 学习day6

# 面向过程没有返回值,隐式返回None
# 函数式编程(和函数不是一回事)
import time
def fun1():
    time_format = '%Y-%m-%d %X'
    time_now = time.strftime(time_format)
    print(time_now)
    return 0

# 面向过程
def fun2():
    time_format = '%Y-%m-%d %X'
    time_now = time.strftime(time_format)
    print(time_now)

def fun3():
    time_format = '%Y-%m-%d %X'
    time_now = time.strftime(time_format)
    print(time_now)
    return 1,'sad',['aaa','bbb'],{'name':'aaa'}

x = fun1()
y = fun2()
z = fun3()

print(x)
print(y)
print(z)
# 总结:
# 返回值数=0:返回None
# 返回值数=1:返回一个对象
# 返回值数>1:返回一个元组

# 形参不占内存,实参占内存
# 位置实参顺序要一致,若关键字实参的话,则顺序无关紧要
def animal(type,name):
    '''宠物信息'''
    print('I have a ' + type + '.')
    print('My ' + type + "'s name is " + name.title() + '.')
animal('hamster','harry')
animal(type = 'hamster',name = 'harry')
animal(name = 'harry',type = 'hamster')

print('------------------------------')

# 形参指定默认值,有默认值的形参一定要放在无默认值的后面
def animal(type,name='harry'):
    '''宠物信息'''
    print('I have a ' + type + '.')
    print('My ' + type + "'s name is " + name.title() + '.')
animal('hamster')

print('--------------------------')

# 实参变成可选化
def name(first_name,last_name,middle_name=''):
    '''返回完整名字'''
    if middle_name:
        full_name = first_name+' '+middle_name+' '+last_name
    else:
        full_name = first_name + ' ' + last_name
    return full_name.title()

new_name = name('jimi','hendrix')
print(new_name)
new_name = name('john','hooker','lee')
print(new_name)


# 传递列表
def get_users(names):
    '''问候列表中的多有用户'''
    for name in names:
        print('Hello, ' + name.title() +'!')

usernames = ['刘备','关羽','张飞']
get_users(usernames)


# 函数中对列表的修改都是永久性的
def print_models(unprinted_designs , completed_models):
    '''
    模拟打印每个设计,知道没有未打印的设计为止
    打印每个设计后,都将其移到列表completed_models中
    '''
    while unprinted_designs:
        current_design = unprinted_designs.pop()
        # 模拟打印模型过程
        print('Printing model: ' + current_design)
        completed_models.append(current_design)

def show_completed_models(completed_models):
    '''显示打印好的所有模型'''
    print('\nThe following models have been printed:')
    for completed_model in completed_models:
        print(completed_model)

unprinted_designs = ['iphone case' , 'robot pendant' , 'dodecahedron']
completed_modes =[]
print_models(unprinted_designs , completed_modes)
show_completed_models(completed_modes)
print(unprinted_designs)
print(completed_modes)

# 若禁止函数修改列表,可以使用切片表示法[:]创建列表的副本
# print_models(unprinted_designs[:] , completed_modes)
# show_completed_models(completed_modes)
# print(unprinted_designs)
# print(completed_modes)

# 传递任意数量的实参
def make_pizza(*toppings):   # 形参*toppings创建了一个空元组,并将收到的所有值都封装到这个元组中
    '''打印顾客点的配料'''
    print(toppings)

make_pizza('pepperoni')
make_pizza('mushrooms','green peppers','extra cheese')

# 如果要让函数接收不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后,
# 先匹配位置实参和关键字实参。
def make_pizza(size , *toppings):
    '''概述要制作的pizza'''
    print("\nMaking a " + str(size) + "-inch pizza with the following toppings:")
    for topping in toppings:
        print("- " + topping)

make_pizza(12,'pepperoni')
make_pizza(16,'mushrooms','green peppers','extra cheese')


# 使用任意数量的关键字实参
# 形参**user_info创建了一个空字典,并将收到的所有名称—值对都封装到这个字典中。
def build_profile(first,last,**user_info):
    profile = {}
    profile ['first name'] = first
    profile ['last name'] = last
    for key , value in user_info.items():
        profile [key] = value
    return  profile

user_profile = build_profile('albert','einstein',
                             location = 'princeton',
                             field = 'physics')
user_profile1 = build_profile('albert','einstein',
                             **{'location':'princeton',
                             'field':'physics'}
                             )
print(user_profile)
print(user_profile1)

# *接收N个位置参数,转化为元组形式;**接收N个关键字参数,转化为字典形式
def test(name,age = 18,*args,**dic):
    print(name)
    print(age)
    print(args)
    print(dic)

test('刘备',50,60,'关羽','张飞',sex='m',location='China')


def funx(x):
    def funy(y):
        return x*y
    return funy   #return funy返回的是一个对象,可理解为funx是funy的一个对象

print(funx(7)(8))

def funx1(x):
    def funy1(y):
        return x*y
    return funy1() # return funy()返回的是funy的函数返回值,所以此处报错
print(funx1(7)(8))

def funx1(x):
    def funy1(y):
        return x*y
    return funy1(8)
print(funx1(7))

# 高阶函数:变量可以指向函数,函数的参数能接受变量,
# 那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

def add(x,y):
  return x+y

def add_twice(func,x,y):
  return func(func(x,y),func(x,y)) # 计算(5+10)+(5+10)

a=5
b=10
print(add_twice(add,a,b))


# 匿名函数,关键字:lambda
# lambda只是一个表达式,函数体比def简单很多。
# lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
# lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
# 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
# 匿名函数经常和其他函数配合使用,比如map(),reduce()

sum = lambda arg1, arg2: arg1 + arg2;
print("相加后的值为 : ", sum(10, 20))

# python2:map返回的是一个list;python3:map返回的是一个迭代器。
res1 = map(lambda x:x**2,[1,2,3,4])
for item in res1:
    print(item)

res2 = reduce(lambda x,y:x*y,range(1,6))
print(res2)
# 1.必须有一个明确的结束条件
# 2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少
# 3.递归效率不高,递归层次过多会导致栈溢出

def fun(n):
    print(n)
    if n > 0:
        return  fun(n//2) # 取整除,返回商的整数部分(向下取整)
    print('---',n)
fun(10)
age = 18 # 这里的age是全局变量
lis = [1,2,3,4,5] # 这里的lis是全局变量
def change_name(name):
    global age # 强制性在函数内更改全局变量,强烈建议不这样做
    age = 20 # 这里的age是局部变量,简单的变量是无法更改全局的
    lis[0] = 6 #复杂的变量是会将全局更改的
    print("before change: ",name,age)
    name = '关羽' # 这里的name是局部变量
    print("after change",name,age)
    print(lis)

print(age)
name = '刘备'
change_name(name)
print(name,age)
print(lis)
age=14
print(age)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值