第6次全天课笔记-20180819

第6次全天课笔记 20180819

习题:

找到列表中第二大的数,可以用多种方法解决。

思路1:

找到最大的,删除掉,再找最大的

list1 = [5,8,9,34,214,54,22]

扫描二维码关注公众号,回复: 2876915 查看本文章

list1_max = max(list1)

print(list1_max)

list1.remove(list1_max)

list1_max = max(list1)

print(list1_max)

思路2:

排好序找倒数第二个

list1 = [5,8,9,34,214,54,22]

list1.sort()  #原地排序  ; sorted(list1) 非原地排序,list1不改变

print(list1[-2])

思路3:

遍历,声明两个变量,一个存最大的

一个存第二大的,然后逐一比对。

s = [1,2,3,4,5,-1,-2]

max_num = s[0]

second_max_num = s[0]

for i in s:

    if i> max_num:

        second_max_num = max_num

        max_num = i

print("第二大的元素是:",second_max_num)

习题2:

python代码得到2个列表的交集与差集

不许用set

交集思路:遍历list1,判断是否在list2中,

在的话,则存入一个列表中。

差集思路:分别遍历list1和2,如果不在对方的

list中,则存入一个列表中

s1 = [1,2,3,9,10]

s2=[2,3,9,11]

result = []

for i in s1:

    if i in s2:

        result.append(i)

print("交集:",result)

差集:

s1 = [1,2,3,9,10]

s2 = [2,3,9,11]

result = []

for i in s1:

    if i not in s2:

        result.append(i)

for i in s2:

    if i not in s1:

        result.append(i)

print("差集:",result)

差集2的实现方法: 2个集合的并集-交集=差集

s1 = [1,2,3,9,10]

s2=[2,3,9,11]

result1 = []

result2 = []

for i in s1:

    if i in s2:

        result1.append(i)

print("交集:",result1)

s1=list(set(s1+s2))

for i in s1:

    if i not in result1:

        result2.append(i)

print("差集:",result2)

冒泡排序:

s = [-1,1,-2,2,3,-3]

第一步:交换2个元素

交换的方法1:

a,b = b,a

交换2:

temp=b

b=a

a=temp

第二步:我要找到这个list中最大的元素,把它放到列表的最后位置

位置0和位置1比,如果大,交换,否则不换

位置1和位置2位置比,如果大,交换,否则不换

位置2和位置3位置比,如果大,交换,否则不换

...

位置4和和位置5位置比,如果大,交换,否则不换

1)基于坐标做遍历,最后一个元素不需要做遍历动作

遍历的反射:

   1 把元素逐一取出来

   2 基于坐标位置逐一取出来,i,i+1

s = [-1,1,-2,2,3,-3]

for i in range(len(s)-1):

    if s[i] > s[i+1]:

        temp=s[i]

        s[i]=s[i+1]

        s[i+1]=temp

print (s)

2)使用if当前元素和后一个元素做比对,如果大了,交换,否则啥也不干

把最后1个元素我不处理了,把之前的所有数,在做相同工作,第二大

s = [-1,1,-2,2,3,-3]

for i in range(len(s)-1-i):

    if s[i] > s[i+1]:

        temp=s[i]

        s[i]=s[i+1]

        s[i+1]=temp

print (s)

把最后2个元素我不处理了,把之前的所有数,在做相同工作,第三大

把最后3个元素我不处理了,把之前的所有数,在做相同工作,第四大

.....

把最后n-1个元素我不处理了,把之前的所有数,在做相同工作,第n大

s = [-1,1,-2,2,3,-3]

for j in range(len(s)-1):

    for i in range(len(s)-1-j):

        if s[i] > s[i+1]:

            temp=s[i]

            s[i]=s[i+1]

            s[i+1]=temp

print(s)

dir(__builtins__)  #查看内置的

help(round)  #查看类或类似

 

不推荐使用关键字作为函数名,因为会覆盖已有函数

函数:类外面的函数定义叫做函数

方法:类内部定义的函数叫做方法

求一个字符串中的字母个数函数

需判断传入参数的类型。

isinstance(s,str)

加个要求,必须使用ascii来判断是否字母

def count_letter_num(s):

    if not isinstance(s,str):

        return None

    result = 0

    for i in s:

        if (ord(i) >= ord("a") and ord(i) <= ord("z")) \

         or (ord(i) >= ord("A") and ord(i) <= ord("Z")):

            result +=1

    return result

print("包含的字母数量:",count_letter_num("I am a boy!"))

>>> def print_sth(s):

...     "此函数用于打印"  #文档字符串

...     print(s)

...

>>> print_sth("hi")

hi

>>> print_sth.__doc__

'此函数用于打印'

>>> help(print_sth)

Help on function print_sth in module __main__:

 

print_sth(s)

    此函数用于打印

>>> import os

>>> os.getcwd()

'E:\\'

 

#时间戳   从1970-1-1 00:00

>>> import time

>>> time.time()

1534649995.2979999

 

写一个函数,这个函数要计算浮点数乘法的一万次相乘后的时间耗时,浮

点数可以使用随机小数

def count_float_compute_speed(n):

    import random

    import time

    start_time = time.time()

    for i in range(n):

        result=random.random()**2

    end_time = time.time()

    return end_time-start_time

 

print(count_float_compute_speed(10000000))

 

 

不可变对象:所有的数字、字符串、元组

可变:set dict list 实例

参数传不可变对象的时候,函数内外变量值是独立的

参数传可变对象的时候,函数内外变量值是关联的

在函数内部,使用global变量,会对外部变量有影响。

a=100

def compute():

    global a

    a+=1

compute()

print (a)

#a改变了,是101

def add_end(L=[]):

L.append('END')

return L

print (add_end([1, 2, 3])) #调用正常

print (add_end(['x', 'y', 'z'])) #调用正常

print (add_end())#调用正常

print (add_end())#调用不正常

print (add_end())#调用不正常

 

修改成

def add_end(L=None):

    if L is None:

        L =[]

    L.append('END')

    return L

print (add_end([1, 2, 3])) #调用正常

print (add_end(['x', 'y', 'z'])) #调用正常

print (add_end())#调用正常

print (add_end())#调用正常

print (add_end())#调用正常

 

默认参数值,将推荐值作为默认值

>>> def add(a,b=1,c=2):

...     return a+b+c

...

>>> print(add(1,2,3))

6

>>> print(add(1,2))

5

>>> print(add(1))

4

>>> "******abdc********".strip("*")

'abdc'

>>> "******abdc********".lstrip("*")

'abdc********'

>>> "******abdc********".rstrip("*")

'******abdc'

去除空白字符,包括 空格 /r /n /t 。

 

小练习:

add(a,b)

要求有个值是result来存结果

1 a,b 数字,相加

2 a,b 字符串,就当做字符串相加

3 a,b 如果list就当list相加

4 不满足条件,则返回None

def add(a,b):

    if isinstance(a,(int,float)) and isinstance(b,(int,float)):

        result = a+b

    elif isinstance(a,str) and isinstance(b,str):

        result = a+b

    elif isinstance(a,list) and isinstance(b,list):

        result = a+b

    else:

        return None

    return result

print(add(2,3))

print(add("a","b"))

print(add([1,2],[3,4]))

print(add("a",3))

print(add([1,2],3))

 

命名参数

>>> def add(a,b,c):

...     return a+b+c

...

>>> print(add(c=1,b=2,a=3))

6

>>> print(add(c=1,2,3))

  File "<stdin>", line 1

SyntaxError: positional argument follows keyword argu

命名参数必须放在非命名参数的后面

>>> a,b = 1,2

>>> a

1

>>> b

2

>>> a,b = (1,2)

>>> a

1

>>> b

2

 

>>> def func(a,b):

...     return a,b

...

func(1,2)  ->返回一个元组 (1,2)

 

正向代理:

客户端和服务器之间的一个服务器或者是软件,负责转发用户的

请求到源服务器。

发给不同的公司服务器

在你公司的局域网,某第三方服务器。

 

反向代理:

在被访问服务器的局域网内,你的请求被它收到了之后,

会被反向代理服务器解析你的请求的url,然后将请求转发

给不同的服务器处理。

 

反向代理+你要访问的服务器是一组,是一个公司开发的。

外人不知道。

 

平台,接口层:

10台服务器,1万用户

1台1-1000

2台1001-2000

。。。。

10台9000-10000

 

{ip:“13.2.3.3”,userid:"1"}

解析你的url--->转发相应的服务器

Rewrite

 

练习:

输入5个字母,声明一个可变参数的函数,拼成一个单词。

元组作为函数参数

def word(*arg):

    result=""

    for i in arg:

        result += i

    return result

 

print(word("h","e","l","l","o"))

print(word("h","eddd","le","l2","o3"))

 

字典作为函数参数

def add(**kw):

    print(type(kw))

    for i in kw:

        print(i)

   

    for j in kw.values():

        print(j)

 

print(add(a="1",b=2,c=3))

 

 

题目:使用必填参数、默认参数、可变元组参数、可变字典参数计算一下单词的长度之和。

 

def count_letter_num(a,b="abc",*arg,**kw):

    result = 0

    result += len(a)

    result += len(b)

    print(arg)

    print(kw)

    for i in arg:

        result+=len(i)

    for i in kw.values():

        result+=len(i)

    return result

 

#"a"赋值给参数a了,"b"给参数b了,cde给arg,x和y给kw做key

#f和g作为kw的value

print(count_letter_num("a","b","c","d","e",x="f",y="g"))

print(count_letter_num("a"))

print(count_letter_num("a",c="x"))

 

lambda函数

 

六剑客解决一行代码:

Lambda

切片

Map

Filter

Reduce

推倒列表

 

Repr方法

>>> s=repr([1,2,3])

>>> eval(s)

[1, 2, 3]

>>> s=repr((1,2,3))

>>> eval(s)

(1, 2, 3)

 

 

>>> class P():

...     def __str__(self):

...         return "hi"

...     def __repr__(self):

...         return "ggggg"

...

>>> p=P()

>>> p

ggggg

>>> str(p)

'hi'

 

 

 

>>> type(1)

<class 'int'>

>>> type(1.1)

<class 'float'>

>>> type(1+1j)

<class 'complex'>

>>> type("a")

<class 'str'>

>>> type([1])

<class 'list'>

>>> type((1,2))

<class 'tuple'>

>>> type({1:1})

<class 'dict'>

>>> type(set([1]))   #集合

<class 'set'>

>>> type({1,2})

<class 'set'>

>>>

 

 

Map

大写变小写

list(map(lambda x:x+1,[1,2,3]))

list(map(lambda x:chr(ord(x)+32),["A","B","C"]))

list(map(lambda x:x.lower(),["A","B","C"]))

 

>>> def l(s):return s.lower()

...

>>> list(map(l,"ABCabc"))

['a', 'b', 'c', 'a', 'b', 'c']

 

Filter

#过滤偶数

>>> def f(n):

...     if n % 2 ==0:

...         return n

...

 

>>> list(filter(f,[1,2,3,4]))

[2, 4]

 

#过滤小写字母

>>> def f(n):

...     if n >="a" and n <="z":

...         return n

...

>>> list(filter(f,"AAaaBBbb"))

['a', 'a', 'b', 'b']

 

Reduce

from functools import reduce

>>> reduce(lambda x,y:x+y,[1,2,3,4])

10

 

第一次计算:x=1,y=2

第二次计算:x=3,y =3

第三次计算:x=6,y=4

6+4=10

 

递归

1)  调用自己

2)  有结束的判断

 

累加:1+2+3+4+5

result =0

for i in range(1,6):

    result +=i

 

def add(n):

    

    if n ==1:

        return 1

    return add(n-1)+n

 

 

n=3:第一次调用:add(3-1)+3--->add(2)+3=3+3=6

n=2:第二次调用:add(2-1)+2--->add(1)+2=1+2=3

n=1:第三次调用:add(1)--->return 1

 

猜你喜欢

转载自www.cnblogs.com/xuefeifei/p/9504830.html