python基础3 集合 三元运算 深浅拷贝 函数

一 上节课拾遗

1 运算符 

  in

   字符串 判断  : “hello” in "asdasfhelloasdfsadf"

   列表元素判断:"li" in ['li', 'ok']

   字典key判断:key in dic.keys()

2 基本的数据类型

        类名()  其实就是执行类的 __init__
        
        int()
            __init__(self,args,base=10)
    
int
        a. 创建方式 两种
            n1 = 123      # 根据int类,创建了一个对象
            n2 = int(123) # 根据int类,创建了一个对象 类的实例化就是对象
        b. int内部优化
            1、n1 和 n2 的内存地址相同
                n1 = 123
                n2 = n1
            2、按理说 n1 和 n2 的内存地址不相同
                n1 = 123
                n2 = 123
            但是Python内部做了优化,
                -5 ~ 257 以内的数,按照 2 的方式写时,都是指向同一个内存
                    n1 = 123
                    n2 = 123
                除此以外的数,都是n1 和 n2 的内存地址不相同  python源码可以改取值范围
                    n1 = 123123
                    n2 = 123123
            3、id查看对象的内存地址
                    n1 = 123
                    i1 = id(n1)
                    print(i1)
                或者
                    i1 = id(123)
                    print(i1)
    
        c. int长度限制
                32    -2**31 ~ 2 **31 -1
                64    -2**63 ~ 2**63 - 1
       数字后有L 代表长整型
            python 2.2之后,超过int的最大长度后,会自动转换成long类型,long类型无长度限制
            
            python 3之后,int自己就无长度限制了

        
    str,
        a. 创建方式
            s1 = "alex"
            s1 = str('alex')
            s1 = str('alex') #传参 字节和编码
        b. 特有功能
            # 两端去除空格
            # s1.strip()

            # 以 .. 开头
            # s1.startswith()

            # 找子序列 "12","h"
            # s1.find()

            # 将字符串中的某子序列替换成 指定的值
            # s1.replace()

            # 变大写
            # s1.upper()

            # 是。。。吗?
            # s1.isalpha()
            
        c. 公共功能
            索引:只能取一个元素
            切片:取多个元素
            len:
                len("刘建佐")
                3.5 ==》 字符  (utf-8 中 规定1个汉字3个字节,但是3版本中 1个汉字就是一个字符,不是字节。所以这里len是3)
            for3.5 ==》 字符  (3 版本中 循环汉字字符串不是字节,而是按照字符来进行循环的)
                
            编码、for   bytes方法:转换成字节
          3版本python中 汉字字符串循环不是按照字节循环,而是按照字符循环。
                name = "李露"
                for i in name:
                    print(i) #循环打印每个汉字而不是字节
                    bytes_list = bytes(i, encoding='utf-8')  #将汉字转成字节,编码是utf-8
                    print(bytes_list)
                    for b in bytes_list:
                1、3.5 for循环时候,循环的每一个元素是 “字符”
                2、字符 =》 字节
                    bytes_list = bytes("字符串",encoding='utf-8')
                    
                        # utf-8 -> 3字节 1个汉字
                        # gbk   -》 2字节 1个汉字
                    print(bytes_list) # 默认每一个字节都是16进制表示
                    for b in bytes_list:
                        print(b)      # 默认每一个字节都是10进制表示
                
                3、10进制的数字 ==》 2进制
                    len
                    id
                    bin(10进制的数字)
        d、 bytes和str的转换   将字节转换成字符串 bytes方法
                a = "李露"
                # 将字符串转换成字节
                b1 = bytes(a, encoding='utf-8')
                print(b1)
                b2 = bytes(a, encoding='gbk')
                print(b2)
                # 将字节转换成字符串

                newa1 = str(b1, encoding="utf-8")
                print(newa1)

                newa2 = str(b2, encoding='gbk')
                print(newa2)


                ###########
                x = str()
                # 创建字符串
                # 转换成字符串,字节,编码
                m = bytes()
                # 创建字节
                # 转换成字节,字符串,要编程什么编码类型的字节

python进制转换
hex 可以 十进制转16进制   二进制转16进制    结果都是字符串
>>> hex(0b10)
'0x2'
>>> hex(10)
'0xa'
bin 可以十进制转2进制  16进制转2进制   结果都是字符串
>>> bin(10)
'0b1010'
>>> bin(0x2)
'0b10'
int 可以16进制转换十进制 2进制转换十进制 
>>> int(0xe)         
14                   
>>> int(0b100)       
4                    
 

    list
        可变元素的“集合”
        
        -----------
        str -> 创建字符串,或者将其他的转换成字符串
        ------------------------------------------
        list -> 创建列表,将其他元素转换成列表
        
        a. 创建和转换
            1、创建
                li = [11,22,33,4]
                li = list()
                li = list([11,22,33,4]) 
            2、转换  注:放可迭代的 凡是可以for循环的都可以迭代。  字符串 元组 字典 列表本身 都可以迭代
                s1 = "李露"
                # for,字符 ==> 可迭代
                l1 = list(s1) # for循环,将循环的每一个元素,当做列表的元素
                # ["李", "露"]
                print(l1)
                        
         # 元组 转换成列表
                # t2 = ("alex", "laonanhai", "seven")
                # l2 = list(t2)
                # print(l2)

                # 字典  转换成列表
                # dic = {'k1': "alex", "k2": 'seven'}
                # l3 = list(dic.items())
                # print(l3)
                # 字符串,元组,字典 =》 列表

        b. 列表特有功能
            # 追加
            # li.append()
            # 清除
            # li.clear()
            # 扩展自己,用另外一个可迭代的对象,扩充到自己内部
            # str,list,dict,tuple
            # s = "李露"
            # li.extend(s)
            # print(li)
            # 翻转,自己内部元素翻转
            # li.reverse()
            # 向指定位置插入指定元素
            # li.insert(1, "X")
        c. 公共功能
            li = ["alex", "eric", 'seven', 123]
            索引:li[2]
            切片:li[2:3]
            del
       enumerate
            for
            len
        join
        d. 多层列表 字典取值
            li = ["alex", "eric", 'seven', 123]
            li = [ "alex" , 123, {"k1":"v1", "k2": {"vv": (11,22,123), "ii": 456}}]
            
            li[2] --> {"k1":"v1", "k2": {"vv": 123, "ii": 456}}
            li[2]['k2'] ==> {"vv": 123, "ii": 456}
            li[2]['k2']["vv"] ==> (11,22,123)
            li[2]['k2']["vv"][2]
                
    元组 tuple   转换时候放可迭代的,即可以for循环取的类型。 比如  字符串  列表 字典都可以循环
        a. 创建和转换
            t = (11,22,33)
            t = tuple((11,22,33))  
            t = tuple([]) # 字符串,列表,字典
        b. 特有方法
            count
            index
        c. 嵌套(元素不可修改) 注:如果元素是列表或者字典则可以修改
            t = (11,22,33)
            t = (11,22,["alex", {"k1": "v1"}])

            
        e. 元组的特性,不可修改,谁不可被修改  #如果元素是列表或者字典可以修改
            元组,儿子不能变
            元组,儿子不能变,孙子,...
            
      整理: 元组 字符串 特性总结
          一般字符串,执行一个功能,生成一个新内容,原来内容不变
          list,tuple,dict,执行一个功能,自身进行变化
上节拾忆 基本数据类型
    字典:
列表一句变字典
li = [11,12,13]
dic = dict(enumerate(li,10))
print(11)
print(dic)
1、创建
            a = {"k1": 123}
            a = dict()
            
            li = [11,22,33]
            new_dict = dict(enumerate(li))
            print(new_dict)
        2、字典内部功能
            keys() #
            values()
            items()
            pop()
       get() #获取字典的key对应的value,如果该key不存在,则返回None
       fromkeys(seq,value=None) # 将有序的seq 作为字典的key,而value则为所有可以的公共值。共享其值     key() 3版本取的时候 要么将字典的key 用list类进行转换 要么for循环放到空列表里面
        2 版本 print(dic.keys()) 直接返回 一个列表
          
        3 版本 print(dic.keys()) 返回的是一个类
            
        
      fromkeys(seq,value=None) 解释:
        
          默认不写value的话,所有的值为None
n = dict.fromkeys(['k1', 'k2'], [])   #默认逗号后面不给的话,key对应的value都是None

n['k1'].append(2)  #我们修改逗号后面的空列表元素 打印 所有key的value也会修改
print(n)

n['k1'] = 3  # 而单独修改key的value的话,只有 这个key的value改了,而其他的key对应的value都不变
print(n)

n = dict.fromkeys()  #默认逗号后面不给的话,key对应的value都是None
print(n)

 

 

二 集合 set 

set集合,是一个无序且不重复的元素集合

class set(object):
    """
    set() -> new empty set object
    set(iterable) -> new set object
     
    Build an unordered collection of unique elements.
    """
    def add(self, *args, **kwargs): # real signature unknown
        """
        Add an element to a set,添加元素
         
        This has no effect if the element is already present.
        """
        pass
 
    def clear(self, *args, **kwargs): # real signature unknown
        """ Remove all elements from this set. 清楚内容"""
        pass
 
    def copy(self, *args, **kwargs): # real signature unknown
        """ Return a shallow copy of a set. 浅拷贝  """
        pass
 
    def difference(self, *args, **kwargs): # real signature unknown
        """
        Return the difference of two or more sets as a new set. A中存在,B中不存在
         
        (i.e. all elements that are in this set but not the others.)
        """
        pass
 
    def difference_update(self, *args, **kwargs): # real signature unknown
        """ Remove all elements of another set from this set.  从当前集合中删除和B中相同的元素"""
        pass
 
    def discard(self, *args, **kwargs): # real signature unknown
        """
        Remove an element from a set if it is a member.
         
        If the element is not a member, do nothing. 移除指定元素,不存在不保错
        """
        pass
 
    def intersection(self, *args, **kwargs): # real signature unknown
        """
        Return the intersection of two sets as a new set. 交集
         
        (i.e. all elements that are in both sets.)
        """
        pass
 
    def intersection_update(self, *args, **kwargs): # real signature unknown
        """ Update a set with the intersection of itself and another.  取交集并更更新到A中 """
        pass
 
    def isdisjoint(self, *args, **kwargs): # real signature unknown
        """ Return True if two sets have a null intersection.  如果没有交集,返回True,否则返回False"""
        pass
 
    def issubset(self, *args, **kwargs): # real signature unknown
        """ Report whether another set contains this set.  是否是子序列"""
        pass
 
    def issuperset(self, *args, **kwargs): # real signature unknown
        """ Report whether this set contains another set. 是否是父序列"""
        pass
 
    def pop(self, *args, **kwargs): # real signature unknown
        """
        Remove and return an arbitrary set element.
        Raises KeyError if the set is empty. 移除元素
        """
        pass
 
    def remove(self, *args, **kwargs): # real signature unknown
        """
        Remove an element from a set; it must be a member.
         
        If the element is not a member, raise a KeyError. 移除指定元素,不存在保错
        """
        pass
 
    def symmetric_difference(self, *args, **kwargs): # real signature unknown
        """
        Return the symmetric difference of two sets as a new set.  对称交集
         
        (i.e. all elements that are in exactly one of the sets.)
        """
        pass
 
    def symmetric_difference_update(self, *args, **kwargs): # real signature unknown
        """ Update a set with the symmetric difference of itself and another. 对称交集,并更新到a中 """
        pass
 
    def union(self, *args, **kwargs): # real signature unknown
        """
        Return the union of sets as a new set.  并集
         
        (i.e. all elements that are in either set.)
        """
        pass
 
    def update(self, *args, **kwargs): # real signature unknown
        """ Update a set with the union of itself and others. 更新 """
        pass
set 集合class
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
__author__ = 'liujianzuo'
a={1:2,4:5}
b=set(a)

b.add(111111)
b.clear()
print(b)

n = {11,22,33}
b = {22,66}
c = {11}

# n中有的b中没有的赋值给新的变量 打印
new_n = n.difference(b)
print(new_n)

#n中有的 b中没有的 更新到n
# n.difference_update(b)
# print(n)

# 将迭代的序列加入
n.update("al")
n.update([1,3,4])
print(n)

#n存在的b不存在的 b存在n不存在的 组合一起输出
ret=n.symmetric_difference(b)
ret2 = n.symmetric_difference({11,22,33})
print(ret)
print("=========")
# n存在的b不存在的 b存在n不存在的 组合一起 更新到前面的集合
n.symmetric_difference_update(b)
print(n)

#  是否是子集  不是返回false  是的话True
ret = n.issubset(c)  # n是不是c的子
print(ret)
ret1 = c.issubset(n)  # c是不是n的子
print(ret1)
ret2 = n.issuperset(c) # n是不是c的父
print(ret2)


# pop discard remove 三个删除的区别

#pop 删除同时可以获取到该值
ret = n.pop() #由于集合是无序的,所以pop删除也是无序的
print(ret)
# discard 删除集合元素,如果元素不存在 返回False 不报错
n.discard(11)
print(n)
#remove 删除集合元素 如果元素不存在 报错
#n.remove(99)

z = {11,22,33}
p = {44}

z.intersection(p)  #取交集并更新到z中
print(z)


集合 练习

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
__author__ = 'liujianzuo'

old_dict = {
    "#1":11,
    "#2":11,
    "#3":11,
}
new_dict = {
    "#1":33,
    "#4":22,
    "#7":100,
}
# b = set(old_dict.keys())
# print(b)
s1 =set()
s2 =set()
for i in  old_dict.keys():
    s1.add(i)
for n in new_dict:
    s2.add(n)
print(s1,s2)
ret1 = s1.difference(s2)
print("for deling :",ret1)
ret2 = s2.difference(s1)
print("for adding:",ret2)
# ret=s1.intersection(s2)
# print(ret)
for i in s1 :
    del old_dict[i]

for i in  s2:
    old_dict[i]=new_dict[i]

print(old_dict)
set集合练习
交集

>>> a.append(10)
>>> set(a)
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
>>> b =range(6)
>>> a = set(a) 
>>> b =set(b)
>>> a
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
>>> b
set([0, 1, 2, 3, 4, 5])
取交集
>>> a & b
set([0, 1, 2, 3, 4, 5])
交集应用场景:比如两个班级都叫alex或者两个班级都是100分的 或者两个班级中都大于多少分的

并集应用
>>> a | b
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

差集
>>> a - b
set([8, 9, 10, 6, 7])

对称差集

>>> a - b
set([8, 9, 10, 6, 7])
把两个里面对方都没有的打印出来


A b 差集
a ^ b

set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
>>> b
set([0, 1, 2, 3, 4, 5, 12])
>>> a ^ b
set([6, 7, 8, 9, 10, 11, 12])
a.add集合中添加一项,同样的去重不同样的增加
>>> a.add(0) 
>>> a.add(22)
>>> a
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 22])

a.update集合添加多项
>>> a.update([23,34,35])
>>> a
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 34, 35, 22, 23])

添加一个集合到另一个集合
>>> a.update(b)
>>> a
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 34, 35, 22, 23])
#b.issubset(a) a.issuperset(b) 测试b中的每一个元素都在a中
>>> len(a)
15
>>> len(b)
6
>>> b in a
False
>>> a in a
False
>>> import tab
>>> b.issubset(a)  #测试b中的每一个元素都在a中
True
>>> a.issubset(b)
False
>>> 3 in a
True
>>> b.issuperset(a)
False
>>> a.issuperset(b)  #测试b中的每个元素都在a中
True
set集合练习

 

练习:寻找差异

# 数据库中原有
old_dict = {
    "#1":{ 'hostname':c1, 'cpu_count': 2, 'mem_capicity': 80 },
    "#2":{ 'hostname':c1, 'cpu_count': 2, 'mem_capicity': 80 }
    "#3":{ 'hostname':c1, 'cpu_count': 2, 'mem_capicity': 80 }
}
   
# cmdb 新汇报的数据
new_dict = {
    "#1":{ 'hostname':c1, 'cpu_count': 2, 'mem_capicity': 800 },
    "#3":{ 'hostname':c1, 'cpu_count': 2, 'mem_capicity': 80 }
    "#4":{ 'hostname':c2, 'cpu_count': 2, 'mem_capicity': 80 }
}

 

需要删除:?
需要新建:?
需要更新:? 
注意:无需考虑内部元素是否改变,只要原来存在,新汇报也存在,就是需要更新

 

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
__author__ = 'liujianzuo'

# 数据库中原有
old_dict = {
    "#1":{ 'hostname':1, 'cpu_count': 2, 'mem_capicity': 80 },
    "#2":{ 'hostname':1, 'cpu_count': 2, 'mem_capicity': 80 },
    "#3":{ 'hostname':1, 'cpu_count': 2, 'mem_capicity': 80 }
}

# cmdb 新汇报的数据
new_dict = {
    "#1":{ 'hostname':1, 'cpu_count': 2, 'mem_capicity': 800 },
    "#3":{ 'hostname':1, 'cpu_count': 2, 'mem_capicity': 80 },
    "#4":{ 'hostname':2, 'cpu_count': 2, 'mem_capicity': 80 }
}
# b = set(old_dict.keys())
# print(b)
s1 =set()
s2 =set()
for i in  old_dict.keys():
    s1.add(i)
for n in new_dict:
    s2.add(n)

new_jiaoji = s1.intersection(s2)
print(new_jiaoji)
for j in new_jiaoji:
    if old_dict[j] != new_dict[j]:
        print("need updating: { '%s': %s}"%(j,new_dict[j]))

print(s1,s2)
ret1 = s1.difference(s2)
print("for deling :",ret1)
ret2 = s2.difference(s1)
print("for adding:",ret2)
# ret=s1.intersection(s2)
# print(ret)
for i in s1 :
    del old_dict[i]

for i in  s2:
    old_dict[i]=new_dict[i]

print(old_dict)
set集合练习题答案 寻找差异 

三、三元运算符

 

python 的三元运算

  变量名 = 变量1 if 条件判断成立 else 变量2

      意指: 条件成立 变量名值为变量1 否则为变量2

 

name = "eric" if 1 == 1 else "alex"
print("==",name)

 

lambda 带if条件的三元运算

 

l1 = [11,22,33,44,55]
# for i in l1:
#     if i % 2 == 0:
#         m = map(lambda x:x+100,[i,])
#         l1[l1.index(i)] = list(m)[0]
# print(l1)
k=map(lambda x:(x+100) if (x%2==0) else x,l1)
print(list(k))

  

四  深浅拷贝

 1 数字和字符串

对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。

 

import copy
# ######### 数字、字符串 #########
n1 = 123
# n1 = "i am alex age 10"
print(id(n1))
# ## 赋值 ##
n2 = n1
print(id(n2))
# ## 浅拷贝 ##
n2 = copy.copy(n1)
print(id(n2))
  
# ## 深拷贝 ##
n3 = copy.deepcopy(n1)
print(id(n3))

 

二、其他基本数据类型

 

对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。

1、赋值

赋值,只是创建一个变量,该变量指向原来内存地址,如:

n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
  
n2 = n1

 

2、浅拷贝

浅拷贝在内存中只额外创建第一层数据

import copy
  
n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
  
n3 = copy.copy(n1)

 

3、深拷贝

深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)  最底层数据要满足第一条赋值变量的条件

import copy
  
n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
  
n4 = copy.deepcopy(n1)

 

 

五 函数 

 

1、背景

在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处,如下:

while True:
    if cpu利用率 > 90%:
        #发送邮件提醒
        连接邮箱服务器
        发送邮件
        关闭连接
    
    if 硬盘使用空间 > 90%:
        #发送邮件提醒
        连接邮箱服务器
        发送邮件
        关闭连接
    
    if 内存占用 > 80%:
        #发送邮件提醒
        连接邮箱服务器
        发送邮件
        关闭连接

一看上述代码,if条件语句下的内容可以被提取出来公用,如下:

def 发送邮件(内容)
    #发送邮件提醒
    连接邮箱服务器
    发送邮件
    关闭连接
    
while True:
    
    if cpu利用率 > 90%:
        发送邮件('CPU报警')
    
    if 硬盘使用空间 > 90%:
        发送邮件('硬盘报警')
    
    if 内存占用 > 80%:

对于上述的两种实现方式,第二次必然比第一次的重用性和可读性要好,其实这就是函数式编程和面向过程编程的区别:

  • 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
  • 面向对象:对函数进行分类和封装,让开发“更快更好更强...”

   函数式编程最重要的是增强代码的重用性和可读性

 

2、定义和使用

1 def 函数名(参数):
2        
3     ...
4     函数体
5     ...
6     返回值

 

函数的定义主要有如下要点:

  • def:表示函数的关键字
  • 函数名:函数的名称,日后根据函数名调用函数
  • 函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...
  • 参数:为函数体提供数据
  • 返回值:当函数执行完毕后,可以给调用者返回数据。 注意是返回给函数调用者

 

 2.1 返回值

函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。

以上要点中,比较重要有参数和返回值:

如下  n5 返回值 返回给其调用者  再返回给上一层调用者。  如果 n4 n3 n2 n1 都不加return 则返回none
def
n5(): return 5 def n4(): return n5() def n3(): return n4() def n2(): return n3() def n1(): return n2() ret1 = n1() print(ret1)
 1 def 发送短信():
 2        
 3     发送短信的代码...
 4    
 5     if 发送成功:
 6         return True
 7     else:
 8         return False
 9    
10    
11 while True:
12        
13     # 每次执行发送短信函数,都会将返回值自动赋值给result
14     # 之后,可以根据result来写日志,或重发等操作
15    
16     result = 发送短信()
17     if result == False:
18         记录日志,短信发送失败...

 

2.2 、参数

为什么要有参数?

 对比:

无参数

 1 def CPU报警邮件()
 2     #发送邮件提醒
 3     连接邮箱服务器
 4     发送邮件
 5     关闭连接
 6 
 7 def 硬盘报警邮件()
 8     #发送邮件提醒
 9     连接邮箱服务器
10     发送邮件
11     关闭连接
12 
13 def 内存报警邮件()
14     #发送邮件提醒
15     连接邮箱服务器
16     发送邮件
17     关闭连接
18  
19 while True:
20  
21     if cpu利用率 > 90%:
22         CPU报警邮件()
23  
24     if 硬盘使用空间 > 90%:
25         硬盘报警邮件()
26  
27     if 内存占用 > 80%:
28         内存报警邮件()
29 
30 无参数实现
View Code

有参数

 1 def 发送邮件(邮件内容)
 2 
 3     #发送邮件提醒
 4     连接邮箱服务器
 5     发送邮件
 6     关闭连接
 7 
 8  
 9 while True:
10  
11     if cpu利用率 > 90%:
12         发送邮件("CPU报警了。")
13  
14     if 硬盘使用空间 > 90%:
15         发送邮件("硬盘报警了。")
16  
17     if 内存占用 > 80%:
18         发送邮件("内存报警了。")
19 
20 有参数实现
View Code

2.2.1   函数参数种类

函数的有三中不同的参数:

  • 普通参数
  • 默认参数
  • 动态参数

 普通参数

 1 # ######### 定义函数 ######### 
 2 
 3 # name 叫做函数func的形式参数,简称:形参
 4 def func(name):
 5     print name
 6 
 7 # ######### 执行函数 ######### 
 8 #  'wupeiqi' 叫做函数func的实际参数,简称:实参
 9 func('wupeiqi')
10 
11 普通参数
View Code

默认参数

 1 def func(name, age = 18):
 2     
 3     print "%s:%s" %(name,age)
 4 
 5 # 指定参数
 6 func('wupeiqi', 19)
 7 # 使用默认参数
 8 func('alex')
 9 
10 注:默认参数需要放在参数列表最后
11 
12 默认参数
View Code

动态参数1  : *args   意指可以传入多个元素以逗号分割

 1 def func(*args):
 2 
 3     print args
 4 
 5 
 6 # 执行方式一
 7 func(11,33,4,4454,5)
 8 
 9 # 执行方式二
10 li = [11,2,2,3,3,4,54]
11 func(*li)
12 
13 动态参数
View Code

如果 元素参数是一个列表呢?我们把列表传入输出的一个元素是列表,但是我们想把列表的每个元素当一个参数。调用的时候加*

 1 #!/usr/bin/env python
 2 # _*_ coding:utf-8 _*_
 3 __author__ = 'liujianzuo'
 4 a=[1,3,4]
 5 def fuc(*args):
 6     #print(args)
 7     return args
 8 ret=fuc(a)
 9 print(ret)
10 
11 结果:
12 C:\Python35\python3.exe E:/py_test/s4/s5.py
13 ([1, 3, 4],)
14 
15 
16 
17 #!/usr/bin/env python
18 # _*_ coding:utf-8 _*_
19 __author__ = 'liujianzuo'
20 a=[1,3,4]
21 def fuc(*args):
22     #print(args)
23     return args
24 ret=fuc(*a)
25 print(ret)
26 C:\Python35\python3.exe E:/py_test/s4/s5.py
27 (1, 3, 4)

 

动态参数2:*args   意指可以传入多个元素以key= value  key的格式是按照变量名的命名规范为标准的

 1 def func(**kwargs):
 2 
 3     print args
 4 
 5 
 6 # 执行方式一
 7 func(name='wupeiqi',age=18)
 8 
 9 # 执行方式二
10 li = {'name':'wupeiqi', age:18, 'gender':'male'}
11 func(**li)
12 
13 动态参数2 :**kwargs
View Code

如果 元素参数是一个字典呢?我们把列表传入输出的一个元素是字典,但是我们想把字典的每个key value当一个参数。调用的时候加** 只加*是key

 1 #!/usr/bin/env python
 2 # _*_ coding:utf-8 _*_
 3 __author__ = 'liujianzuo'
 4 a={"k1":2,"k2":3}
 5 def fuc(**args):
 6     #print(args)
 7     return args
 8 ret=fuc(**a)
 9 print(ret)
10 
11 C:\Python35\python3.exe E:/py_test/s4/s5.py
12 {'k1': 2, 'k2': 3}
View Code

 

动态参数3 : *args **kwargs

1 def func(*args, **kwargs):
2 
3     print args
4     print kwargs
View Code
 1 #!/usr/bin/env python
 2 # _*_ coding:utf-8 _*_
 3 __author__ = 'liujianzuo'
 4 a={"k1":2,"k2":3}
 5 b=[1,2,3]
 6 def fuc(*args,**kwargs):
 7     #print(args)
 8     return args,kwargs
 9 ret=fuc(*b,**a)
10 print(ret)

C:\Python35\python3.exe E:/py_test/s4/s5.py
((1, 2, 3), {'k2': 3, 'k1': 2})

扩展:发送邮件实例

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
__author__ = 'liujianzuo'


def email(p,text,subject):
    import smtplib
    from email.mime.text import MIMEText
    from email.utils import formataddr

    ret = True
    try:

        msg = MIMEText(text, 'plain', 'utf-8')
        msg['From'] = formataddr(["武沛齐",'wptawy@126.com'])
        msg['To'] = formataddr(["走人",'424662508@qq.com'])
        msg['Subject'] = subject

        server = smtplib.SMTP("smtp.126.com", 25)
        server.login("wptawy@126.com", "WW.3945.59")
        server.sendmail('wptawy@126.com', [p,], msg.as_string())
        server.quit()
    except:
        ret = False
    return ret


r1=email("1223995142@qq.com","python test email +===","subject==pyhon")
if r1:
    print("发生成功")
else:
    print("发送失败")

 函数变量: 局部变量 与全局变量

 

函数外的变量定义的全局变量,在函数内部修改不了,因为,函数内部需要global一下否则在函数内部只能是局部变量,只是变量名跟全局变量相同而已

  

#!/usr/bin/env python
#_*_coding:utf-8_*_

num = 10

def fun():
    num +=10
    


输出
C:\Python35\python3.exe E:/py_test/s13_xml/log_mokuai.py
Traceback (most recent call last):
  File "E:/py_test/s13_xml/log_mokuai.py", line 10, in <module>
    fun()
  File "E:/py_test/s13_xml/log_mokuai.py", line 7, in fun
    num +=10
UnboundLocalError: local variable 'num' referenced before assignment

这里执行函数是改变不了函数的num的,因为函数的num是局部变量,只是跟全局变量num相同而已。 需要global一下



num = 10
def fun():
    global num
    num += 10
    print(num)

fun()

C:\Python35\python3.exe E:/py_test/s13_xml/log_mokuai.py
20
全局变量与局部变量区别
liujianzuo@python:~/py_training/seminar6/day3$ cat sayHi1.py

age =28   #程序全局变量
def sayHi(name):
        age = 29  #函数局部变量
        '''this is my first test function'''
        print "hello %s,how are you?,my age is %s!" %(name,age)

sayHi('liujianzuo')
print 'age:',age

liujianzuo@python:~/py_training/seminar6/day3$ python sayHi1.py 
hello liujianzuo,how are you?,my age is 29!
age: 28

注释全局变量

#age =28

def sayHi(name):

        age = 29

        '''this is my first test function'''

        print "hello %s,how are you?,my age is %s!" %(name,age)

 

sayHi('liujianzuo')

print 'age:',age

 

报错如下

liujianzuo@python:~/py_training/seminar6/day3$ python sayHi1.py

hello liujianzuo,how are you?,my age is 29!

age:

Traceback (most recent call last):

  File "sayHi1.py", line 9, in <module>

    print 'age:',age

NameError: name 'age' is not defined

更改方法;让局部变全局  global更改局部变全部 不建议使用

#age =28

def sayHi(name):

        global age

        age = 29

        '''this is my first test function'''

        print "hello %s,how are you?,my age is %s!" %(name,age)

 

sayHi('liujianzuo')

print 'age:',age

执行

liujianzuo@python:~/py_training/seminar6/day3$ python sayHi1.py

hello liujianzuo,how are you?,my age is 29!

age: 29

注释局部变量

age =28

def sayHi(name):

#       age = 29

        '''this is my first test function'''

        print "hello %s,how are you?,my age is %s!" %(name,age)

 

sayHi('liujianzuo')

print 'age:',age

执行

liujianzuo@python:~/py_training/seminar6/day3$ python sayHi1.py    

hello liujianzuo,how are you?,my age is 28!

age: 28     

 

练习题

1、简述普通参数、指定参数、默认参数、动态参数的区别

2、写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数

3、写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。

4、写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容。

5、写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。

6、写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。

7、写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。

dic = {"k1""v1v1""k2": [11,22,33,44]}
 
PS:字典中的value只能是字符串或列表

8、写函数,利用递归获取斐波那契数列中的第 10 个数,并将该值返回给调用者。

 

 

 

 1 #!/usr/in/env python
 2 # _*_coding:utf-8_*_
 3 """
 4 普通参数:单个是单个,多个是多个,有多少个,调用的时候就要传几个     称为形式参数
 5 默认参数:只能放在 普通参数后面,不能放到前面 ,不给值的话,就用默认的值
 6 指定参数:调用函数的时候传的实际参数  赋值给指定的参数名
 7 动态参数:*args *kwargs  当然不一定非要叫args 规范而已。 即调用的时候 传列表 key value
 8 """
 9 
10 # a = "al11ex seven ;"
11 # a=input("pls in put :")
12 # alp=0
13 # num=0
14 # spa=0
15 # other=0
16 # for i in a:
17 #     if i.isalpha():
18 #         alp+=1
19 #     elif i.isdigit():
20 #         num+=1
21 #     elif i.isspace():
22 #         spa+=1
23 #     else:
24 #         other+=1
25 # print("alpha:%s num : %s space: %s other:%s" % (alp,num,spa,other))
26 
27 
28 # def djs(*args):
29 #     print(args)
30 #     return len(args[0])
31 # ret=djs([1,2,3])
32 # # ret=djs("alex")
33 # print(ret)
34 
35 
36 # 5
37 # li = ["1","2","3"]
38 # def y(*args):
39 #
40 #     if len(args[0]) > 2:
41 #         ret1=args[0][0:2]
42 #     return ret1
43 # ret=y(li)
44 # print(ret)
45 
46 
47 
48 #6
49 tu = (1,2,3)
50 def m(*args):
51     nu = []
52 
53     for n in args[0]:
54         if args[0].index(n) % 2 == 1:
55             nu.append(n)
56     ret = nu
57     return ret
58 print(m(tu))
59 
60 # 7
61 # dic = {"k1": "v1v1", "k2": [11,22,33,44]}
62 # def x(**kwargs):
63 #     li = []
64 #     for i in kwargs.values():
65 #         if len(i) >2:
66 #             ret = li.append(i[0:2])
67 #     return li
68 #
69 #
70 # ret1 = x(**dic)
71 # print(ret1)
View Code

 

  知识点 all() 函数

all(iterable)
版本:该函数在python2.5版本首次出现,适用于2.5以上版本,包括python3,兼容python3版本。
说明:如果iterable的所有元素不为0、''、False或者iterable为空,all(iterable)返回True,否则返回False;函数等价于:
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
__author__ = 'liujianzuo'
# a={"k1":2,"k2":3}
b=[1,2,3,""]
print(all(b))

def dju(args):
    if type(args) is str:
        if len(b) == 0:
            ret = True
            return "str  have no empty", ret
        else:
            ret =False
            return "str  have no empty", ret
    elif type(args) is list:
        if all(args):
            ret=True
            return "list  have no empty", ret
        else:
            ret=False
            return "list have empty", ret
    elif type(args) is tuple:
        args=list(args)
        if all(args):
            ret = True
            return "tuple have no empty", ret
        else:
            ret = False
            return "tuple have  empty", ret

r1=dju(b)
print(r1)

 

 

 

def func(arg1, arg2,time1):

    if arg1 == 0:
        print
    arg1, arg2
    arg3 = arg1 + arg2
    time1+=1
    if time1 == 11:
        return  arg3

    return  func(arg2, arg3,time1)

ret=func(0, 1 , 3)
print(ret)

 

posted @ 2016-05-03 22:31  众里寻,阑珊处  阅读(716)  评论(0编辑  收藏  举报
返回顶部