设为首页 收藏本站
查看: 796|回复: 0

[经验分享] python3.6.4的学习

[复制链接]

尚未签到

发表于 2018-8-5 10:46:28 | 显示全部楼层 |阅读模式
  [root@mantisbt01 python]# ./13.py
  Please input your name:hadoop

  Please input your>
  Please input your>  hadoop , Your bmi value is: 23.24 !
  Your body type is 正常
  [root@mantisbt01 python]# python
  Python 3.6.4 (default, Mar 19 2018, 10:30:22)
  [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
  Type "help", "copyright", "credits" or "license" for more information.

  >> abs(12)
  12
  >> abs(-12)
  12
  >> abs(0)
  0
  >> abs(-12.3)
  12.3
  >> abs(12.3)
  12.3
  >> abs(1,2)
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  TypeError: abs() takes exactly one argument (2 given)
  >> abs(f)
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  NameError: name 'f' is not defined
  >> max(1,2)
  2
  >> max(1,2,23,4)
  23
  >> max(1,2,23,4,-9,0)
  23
  >> int(321)
  321
  >> int(12.32)
  12
  >> float(12.32)
  12.32
  >> float(12)
  12.0
  >> float('12.32')
  12.32
  >> str(100)
  '100'
  >> str(13)
  '13'
  >> str(as)
  File &quot;<stdin>&quot;, line 1
  str(as)
  ^
  SyntaxError: invalid syntax
  >> str('as')
  'as'
  >> str('a')
  'a'
  >> str(a)
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  NameError: name 'a' is not defined
  >> bool(1)
  True
  >> bool(-1)
  True
  >> bool(0)
  False
  >> bool(a)
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  NameError: name 'a' is not defined
  >> bool('a')
  True
  >> a=abs
  >> a(-2)
  2
  >> n1=255
  >> n2=1000
  >> hex(n1)
  '0xff'
  >> hex(n2)
  '0x3e8'
  >> def my_abs(x):
  ...     if x >=0:
  ...         return x
  ...     else:
  ...         return -x
  ...
  >> my_abs(-9)
  9
  >> my_abs(-8)
  8
  >> my_abs(8)
  8
  >> my_abs(0)
  0
  >> my_abs(a)
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  File &quot;<stdin>&quot;, line 2, in my_abs
  TypeError: '>=' not supported between instances of 'builtin_function_or_method' and 'int'
  >> my_abs('a')
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  File &quot;<stdin>&quot;, line 2, in my_abs
  TypeError: '>=' not supported between instances of 'str' and 'int'
  >>

  [root@mantisbt01 python]# pwd
  /root/python
  [root@mantisbt01 python]# cat 14.py
  def my_abs(x):
  if x >=0:
  return x
  else:
  return -x
  [root@mantisbt01 python]# python
  Python 3.6.4 (default, Mar 19 2018, 10:30:22)
  [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
  Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.

  >> from 14 import my_abs
  File &quot;<stdin>&quot;, line 1
  from 14 import my_abs
  ^
  SyntaxError: invalid syntax
  >>
  KeyboardInterrupt
  >>
  [root@mantisbt01 python]# mv 14.py abstest.py
  [root@mantisbt01 python]# python
  Python 3.6.4 (default, Mar 19 2018, 10:30:22)
  [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
  Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.
  >> from abstest import my_abs
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  File &quot;/root/python/abstest.py&quot;, line 3
  return x
  ^
  TabError: inconsistent use of tabs and spaces in indentation
  >>
  [root@mantisbt01 python]# vi abstest.py
  [root@mantisbt01 python]# python
  Python 3.6.4 (default, Mar 19 2018, 10:30:22)
  [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
  Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.
  >> from abstest import my_abs
  >> my_abs(-18)
  18
  >> my_abs(19)
  19
  >> my_abs(0)
  0
  >> my_abs('a')
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  File &quot;/root/python/abstest.py&quot;, line 2, in my_abs
  if x >=0:
  TypeError: '>=' not supported between instances of 'str' and 'int'
  >> my_abs(a)
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  NameError: name 'a' is not defined
  >>
  >> def nop():
  ...     pass
  ...
  >>
  >> if age >=18:
  ...     pass
  ...
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  NameError: name 'age' is not defined
  >> age=10
  >> if age >=18:
  ...     age
  ...
  >>
  >> my_abs(2)
  2
  >> my_abs(1,2)
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  TypeError: my_abs() takes 1 positional argument but 2 were given
  >> my_abs('A')
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  File &quot;/root/python/abstest.py&quot;, line 2, in my_abs
  if x >=0:
  TypeError: '>=' not supported between instances of 'str' and 'int'
  >> abs('A')
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  TypeError: bad operand type for abs(): 'str'
  >>
  [root@mantisbt01 python]# cp -p abstest.py abstest2.py
  [root@mantisbt01 python]#
  [root@mantisbt01 python]# vi abstest2.py
  [root@mantisbt01 python]# cat abstest2.py
  def my_abs(x):
  if not isinstance(x,(int,float)):
  raise TypeError('bad operand type')
  if x >=0:
  return x
  else:
  return -x
  [root@mantisbt01 python]#

  [root@mantisbt01 python]# cp -p abstest.py abstest2.py
  [root@mantisbt01 python]#
  [root@mantisbt01 python]# vi abstest2.py
  [root@mantisbt01 python]# cat abstest2.py
  def my_abs(x):
  if not isinstance(x,(int,float)):
  raise TypeError('bad operand type')
  if x >=0:
  return x
  else:
  return -x
  [root@mantisbt01 python]# python
  Python 3.6.4 (default, Mar 19 2018, 10:30:22)
  [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
  Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.

  >> from abstest2 import my_abs
  >> my_abs(-9)
  9
  >> my_abs(9)
  9
  >> my_abs(0)
  0
  >> my_abs('A')
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  File &quot;/root/python/abstest2.py&quot;, line 3, in my_abs
  raise TypeError('bad operand type')
  TypeError: bad operand type
  >>
  >> import math
  >> def move(x,y,step,angle=0):
  ...     nx = x + step math.cos(angle)
  ...     ny = y + step  math.sin(angle)
  ...     return nx,ny
  ...
  >> x,y=move(100,100,60,math.pi / 6)
  >> print(x,y)
  151.96152422706632 130.0
  >> r = move(100,100,60,math.pi / 6)
  >> print(r)
  (151.96152422706632, 130.0)
  >>
  >> r
  (151.96152422706632, 130.0)
  >>

  [root@mantisbt01 python]# cat 14.py
  #!/usr/bin/python
  #-- coding: utf-8 --
  import math
  def quadratic(a,b,c):
  if not ( isinstance(a,(int,float)) and isinstance(b,(int,float)) and isinstance(c,(int,float)) ):
  raise TypeError('bad operand type')
  delta=(b*2)-(4bc)
  if delta < 0:
  print('delta小于零,方程无解')
  else:
  x1=(-b+math.sqrt(delta))/(2a)
  x2=(-b-math.sqrt(delta))/(2*a)
  print('x1=%.2f x2=%.2f'%(x1,x2))
  return x1,x2
  print('quadratic(2,3,1)=',quadratic(2,3,1))
  print('quadratic(1,3,-4)=',quadratic(1,3,-4))
  [root@mantisbt01 python]# ./14.py
  delta小于零,方程无解
  quadratic(2,3,1)= None
  x1=2.27 x2=-5.27
  quadratic(1,3,-4)= (2.274917217635375, -5.274917217635375)
  [root@mantisbt01 python]#

  >> def power(x):
  ...     return x*x
  ...
  >> power(4)
  16
  >> power(2)
  4
  >> power(3)
  9
  >> power(11)
  121
  >> def power(x,n)
  File &quot;<stdin>&quot;, line 1
  def power(x,n)
  ^
  SyntaxError: invalid syntax
  >> def power(x,n):
  ...     s=1
  ...     while n > 0:
  ...       n=n-1
  ...       s=s*x
  ...     return s
  ...
  >> power(2,3)
  8
  >> power(3,3)
  27
  >> power(3,4)
  81
  >>
  >> power(5)
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  TypeError: power() missing 1 required positional argument: 'n'
  >> def power(x,n=2):
  ...    s=1
  ...    while n > 0:
  ...      n=n-1
  ...      s=sx
  ...    return
  ...
  >> power(5)
  >> def power(x,n=2):
  ...     s=1
  ...     while n > 0:
  ...       n=n-1
  ...       s=sx
  ...     return s
  ...
  >> power(5)
  25
  >> power(3)
  9
  >> power(3,4)
  81
  >>
  >> def enroll(name,gender):
  ...     print('name:',name)
  ...     print('gender:',gender)
  ...
  >> enroll('Sarah','F')
  name: Sarah
  gender: F
  >> def enroll(name,gender,age=6,city='Beijing'):
  ...     print('name:',name)
  ...     print('gender',gender)
  ...     print('age:',age)
  ...     print('city:',city)
  ...
  >>
  >> enroll('Sarah','F')
  name: Sarah
  gender F
  age: 6
  city: Beijing
  >> enroll('Bob','M',8)
  name: Bob
  gender M
  age: 8
  city: Beijing
  >> enroll('Adam','M',city='shanghai')
  name: Adam
  gender M
  age: 6
  city: shanghai
  >> def add_end(L=[]):
  ...     L.append('END')
  ...     return L
  ...
  >> add_end([1,2,3])
  [1, 2, 3, 'END']
  >> add_end(['x','y','z'])
  ['x', 'y', 'z', 'END']
  >> add_end([1,2,3])
  [1, 2, 3, 'END']
  >> add_end()
  ['END']
  >> add_end()
  ['END', 'END']
  >> add_end()
  ['END', 'END', 'END']
  >> add_end()
  ['END', 'END', 'END', 'END']
  >> def add_end(L=[]):
  ...     if L is None:
  ...         L=[]
  ...     L.append('END')
  ...     return L
  ...
  >> add_end()
  ['END']
  >> add_end()
  ['END', 'END']
  >> add_end()
  ['END', 'END', 'END']
  >> def add_end(L=None):
  ...      if L is None:
  ...          L=[]
  ...      L.append('END')
  ...      return L
  ...
  >> add_end()
  ['END']
  >> add_end()
  ['END']
  >> add_end()
  ['END']
  >>
  >>
  >> def calc(number):
  ...     sum=0
  ...     for n in number:
  ...         sum=sum+nn
  ...     return sum
  ...
  >> calc([1,2,3])
  14
  >> calc([1,2,3,4])
  30
  >> calc(1,2,3)
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  TypeError: calc() takes 1 positional argument but 3 were given
  >>
  >> def calc(number):
  ...     sum=0
  ...     for n in number:
  ...         sum=sum+n*n
  ...     return sum
  ...
  >> calc(1,2,3)
  14
  >> calc([1,2,3])
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  File &quot;<stdin>&quot;, line 4, in calc
  TypeError: can't multiply sequence by non-int of type 'list'
  >> calc(1,2,3,4)
  30
  >>
  >> calc(1,2)
  5
  >> calc()
  0
  >> nums = [1,2,3]
  >> calc(nums[0],nums[1],nums[2])
  14
  >> calc(*nums)
  14
  >>

  关键字参数

  >>
  >> def person(name,age,kw):
  ...     print('name:',name,'age:',age,'other:',kw)
  ...
  >>
  >> person('Michael',30)
  name: Michael age: 30 other: {}
  >> person('Bob',35,city='Beijing')
  name: Bob age: 35 other: {'city': 'Beijing'}
  >> person('Adam',45,gender='M',job='Engineer')
  name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
  >>
  >> extra={'city':'Beijing','job':'Engineer'}
  >> person('Jack',24,city=extra['city'],job=extra['job'])
  name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
  >>
  >> person('Jack',24,extra)
  name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
  >>
  extra表示把extra这个dict的所有key-value用关键字参数传入到函数的kw参数,kw将获得一个dict,注意kw获得的dict是extra的一份拷贝,对kw的改动不会影响到函数外的extra.

  命名关键字参数

  >> def person(name,age,**kw):
  ...     if 'city' in kw:
  ...         pass
  ...     if 'job' in kw:
  ...         pass
  ...     print('name',name,'age',age,'other:',kw)
  ...
  >> person('Jack',24,city='Beijing',addr='Chaoyang',zipcode=123456)
  name Jack age 24 other: {'city': 'Beijing', 'addr': 'Chaoyang', 'zipcode': 123456}
  >>
  >> def person(name,age,*,city,job):
  ...     print(name,age,city,job)
  ...
  >> person('Jack',24,city='Beijing',job='Engineer')
  Jack 24 Beijing Engineer
  >>

  如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:

  >>
  >> def person(name,age,args,city,job):
  ...     print(name,age,args,city,job)
  ...
  >> person('Jack',24,'Beijing','Engineer')
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  TypeError: person() missing 2 required keyword-only arguments: 'city' and 'job'
  >> person('Jack',24,city='Beijing','Engineer')
  File &quot;<stdin>&quot;, line 1
  SyntaxError: positional argument follows keyword argument
  >> person('Jack',24,city='Beijing',job='Engineer')
  Jack 24 () Beijing Engineer
  >>
  >>
  命名关键字参数可以有缺省值,从而简化调用:
  >>
  >>
  >> def person(name,age,,city='Beijing',job):
  ...     print(name,age,city,job)
  ...
  由于命名关键字参数city具有默认值,调用时,可不传入city参数:
  >> person('Jack',24,job='Engineer')
  Jack 24 Beijing Engineer
  >>

  参数组合

  >> def f1(a,b,c=0,*args,*kw):
  ...     print('a=',a,'b=',b,'c=',c,'args=',args,'kw=',kw)
  ...
  >>
  >> def f2(a,b,c=0,,d,**kw):
  ...     print('a=',a,'b=',b,'c=',c,'d=',d,'kw=',kw)
  ...
  >>
  >> f1(1,2)
  a= 1 b= 2 c= 0 args= () kw= {}
  >> f1(1,2,c=3)
  a= 1 b= 2 c= 3 args= () kw= {}
  >> f1(1,2,'a','b')
  a= 1 b= 2 c= a args= ('b',) kw= {}
  >> f1(1,2,3,'a','b')
  a= 1 b= 2 c= 3 args= ('a', 'b') kw= {}
  >> f1(1,2,3,'a','b','c')
  a= 1 b= 2 c= 3 args= ('a', 'b', 'c') kw= {}
  >> f1(1,2,3,'a','b','c',x=98)
  a= 1 b= 2 c= 3 args= ('a', 'b', 'c') kw= {'x': 98}
  >>
  >> f2(1,2,d=23,ext=None)
  a= 1 b= 2 c= 0 d= 23 kw= {'ext': None}
  >>

  通过一个tuple和dict,也可以调用上述函数:

  >> args=(1,2,3,4)
  >>
  >> kw={'d':99,'x':'#'}
  >>
  >> f1(*args,kw)
  a= 1 b= 2 c= 3 args= (4,) kw= {'d': 99, 'x': '#'}
  >>
  >>
  >> f2(*args,*kw)
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  TypeError: f2() takes from 2 to 3 positional arguments but 4 positional arguments (and 1 keyword-only argument) were given
  >>
  >> args=(1,2,3)
  >>
  >> kw={'d':88,'x':'#'}
  >>
  >> f2(args,kw)
  a= 1 b= 2 c= 3 d= 88 kw= {'x': '#'}
  >>

  [root@mantisbt01 python]# cat ./15.py
  #!/usr/bin/python
  #-- coding:utf-8 --
  def product(numbers):
  product=1
  if numbers==():
  raise TypeError
  else:
  for n in numbers:
  product=product  n

print('product =',product)
  

    return product  

  #test
  print('product(5) =',product(5))
  print('product(5,6) =',product(5,6))
  print('product(5,6,7) =',product(5,6,7))
  print('product(5,6,7,9) =',product(5,6,7,9))
  if product(5) != 5:
  print('test failed!')
  elif product(5,6) != 30:
  print('test failed!')
  elif product(5,6,7) != 210:
  print('test failed!')
  elif product(5,6,7,9) != 1890:
  print('test failed!')
  else:
  try:
  product()
  print('test failed!')
  except TypeError:
  print('test successful')
  [root@mantisbt01 python]# ./15.py
  product(5) = 5
  product(5,6) = 30
  product(5,6,7) = 210
  product(5,6,7,9) = 1890
  test successful
  [root@mantisbt01 python]#
  递归函数

  >> def fact(n):
  ...     if n==1:
  ...         return 1
  ...     return n*fact(n-1)
  ...
  >> fact(1)
  1
  >> fact(5)
  120
  >> fact(100)
  93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
  >> fact(1000)
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  File &quot;<stdin>&quot;, line 4, in fact
  File &quot;<stdin>&quot;, line 4, in fact
  File &quot;<stdin>&quot;, line 4, in fact
  [Previous line repeated 994 more times]
  File &quot;<stdin>&quot;, line 2, in fact
  RecursionError: maximum recursion depth exceeded in comparison
  >>

  [root@mantisbt01 python]# python
  Python 3.6.4 (default, Mar 19 2018, 10:30:22)
  [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
  Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.

  >> def fact(n):
  ...     return fact_iter(n,1)
  ...
  >> def fact_iter(num,product):
  ...     if num==1:
  ...        return product
  ...     return fact_iter(num-1,num*product)
  ...
  >> fact_iter(5,1)
  120
  >> fact_iter(10,1)
  3628800
  >> fact_iter(1,1)
  1
  >> fact_iter(20,1)
  2432902008176640000
  >> fact_iter(1000,1)
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  File &quot;<stdin>&quot;, line 4, in fact_iter
  File &quot;<stdin>&quot;, line 4, in fact_iter
  File &quot;<stdin>&quot;, line 4, in fact_iter
  [Previous line repeated 994 more times]
  File &quot;<stdin>&quot;, line 2, in fact_iter
  RecursionError: maximum recursion depth exceeded in comparison
  >>
  >> fact(10)
  3628800
  >> def fact(n):
  ...     s=1
  ...     for i in range(1,n+1):
  ...        s=si
  ...     return s
  ...
  >> fact(10)
  3628800
  >> fact(5)
  120
  >> from functools import reduce
  >> def Fact(n):
  ...     return reduce((lambda x,y:xy),list(range(1,n+1)))
  ...
  >> Fact(5)
  120
  >> Fact(10)
  3628800
  >>

  汉诺塔的移动可以用递归函数非常简单地实现。
  请编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A、B、C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的方法,例如:
  [root@mantisbt01 python]# cat ./17.py
  #!/usr/bin/python
  #-- coding:utf-8 --
  def move(n,a,b,c):
  if n==1:
  step=1
  print(a,'-->',c)
  return step
  else:
  s1=move(n-1,a,c,b)
  s2=move(1,a,b,c)
  s3=move(n-1,b,a,c)
  step=s1+s2+s3
  return step
  s=move(3,'A','B','C')
  print('need %d steps'%s)
  [root@mantisbt01 python]# ./17.py
  A --> C
  A --> B
  C --> B
  A --> C
  B --> A
  B --> C
  A --> C
  need 7 steps
  [root@mantisbt01 python]#
  高级特性
  比如构造一个1, 3, 5, 7, ..., 99的列表,可以通过循环实现:
  L = []
  n = 1
  while n <= 99:
  L.append(n)
  n = n + 2
  取list的前一半的元素,也可以通过循环实现。
  但是在Python中,代码不是越多越好,而是越少越好。代码不是越复杂越好,而是越简单越好。
  基于这一思想,我们来介绍Python中非常有用的高级特性,1行代码能实现的功能,决不写5行代码。请始终牢记,代码越少,开发效率越高。
  法1:

  >> L=[]
  >> n=1
  >> while n<=99:
  ...     L.append(n)
  ...     n=n+2
  ...
  >> L
  [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]
  >>

  法2:

  >> print(list(range(1,100,2)))
  [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]

  法3:

  >> print([i for i in range(1,100,2)])
  [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]
  >>

  1.切片
  1.1 list

  >> L=['Michael','Sarah','Tracy','Bob','Jack']
  >> [L[0],L[1],L[2]]
  ['Michael', 'Sarah', 'Tracy']
  >> [L[-1],L[-2],L[-3]]
  ['Jack', 'Bob', 'Tracy']
  >> r=[]
  >> n=3
  >> for i in range(n):
  ...     r.append(L)
  ...
  >> r
  ['Michael', 'Sarah', 'Tracy']
  >> L[0:3]
  ['Michael', 'Sarah', 'Tracy']
  >> L[0:4]
  ['Michael', 'Sarah', 'Tracy', 'Bob']
  >> L[1:3]
  ['Sarah', 'Tracy']
  >> L[:3]
  ['Michael', 'Sarah', 'Tracy']
  >> L[-2:]
  ['Bob', 'Jack']
  >> L[-2:-1]
  ['Bob']
  >> L[-1]
  'Jack'
  >> L=list(range(100))
  >> L
  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
  >> L[:10]
  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  >> L[-10:]
  [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
  >> L[10:20]
  [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
  >> L[2:10:2]
  [2, 4, 6, 8]
  >> L[2:10:3]
  [2, 5, 8]
  >> L[::5]
  [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
  >> L[:]
  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
  >>

  1.2 tuple

  >> (0,1,2,3,4,5)[:3]
  (0, 1, 2)
  >> 'ABCDEFG'[:3]
  'ABC'
  >> 'ABCDEFG'[::2]
  'ACEG'
  >>

  利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法:
  [root@mantisbt01 python]# cat 18.py
  #!/usr/bin/python
  #-- coding:utf-8 --
  #def trim(s):

if len(s) == 0:

return s

elif s[0] == '':

return (trim(s[1:]))

elif s[-1] == ' ':

return (trim(s[:-1]))

return s
  def trim(s):
  if s[:1] != ' ' and s[-1:] != ' ':
  return s
  elif s[:1] == ' ':
  return trim(s[1:])
  else:
  return trim(s[:-1])
  if trim('hello  ') != 'hello':
  print('测试失败!')
  elif trim('  hello') != 'hello':
  print('测试失败!')
  elif trim('  hello  ') != 'hello':
  print('测试失败!')
  elif trim('  hello  world  ') != 'hello  world':
  print('测试失败!')
  elif trim('') != '':
  print('测试失败!')
  elif trim('    ') != '':
  print('测试失败!')
  else:
  print('测试成功!')
  [root@mantisbt01 python]# ./18.py
  测试成功!
  2.迭代

  >> d={'a':1,'b':2,'c':3}
  >> for key in d:
  ...     print(key)
  ...
  a
  b
  c
  >> for ch in 'ABC':
  ...     print(ch)
  ...
  A
  B
  C
  >>
  >> from collections import Iterable
  >> isinstance('abc',Iterable)
  True
  >> isinstance([1,2,3],Iterable)
  True
  >> isinstance(123,Iterable)
  False
  >>
  >> for i,value in enumerate(['A','B','C']):
  ...    print(i,value)
  ...
  0 A
  1 B
  2 C
  >> for x,y in [(1,1),(2,4),(3,9)]:
  ...     print(x,y)
  ...
  1 1
  2 4
  3 9
  >>

  请使用迭代查找一个list中最小和最大值,并返回一个tuple:
  使用冒泡排序法
  [root@mantisbt01 python]# cat 19.py
  #!/usr/bin/python
  #-- coding:utf-8 --
  def findMinandMax(L):
  if (L==[]):
  return (None,None)
  else:
  num=len(L)
  for i in range(num):
  for j in range(i):
  if L<L[j]:
  L,L[j]=L[j],L
  return (L[0],L[-1])
  if findMinandMax([]) != (None,None):
  print('测试失败!')
  elif findMinandMax([7]) != (7,7):
  print('测试失败!')
  elif findMinandMax([7,1]) != (1,7):
  print('测试失败!')
  elif findMinandMax([7,1,3,9,5]) != (1,9):
  print('测试失败!')
  else:
  print('测试成功')
  [root@mantisbt01 python]#
  [root@mantisbt01 python]# ./19.py
  测试成功
  3.列表生成式

  >>
  >> list(range(1,11))
  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  >> L=[]
  >> for x in range(1,11):
  ...     L.append(xx)
  ...
  >> L
  [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
  >> [xx for x in range(1,11)]
  [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
  >> [x*x for x in range(1,11) if x%2 == 0]
  [4, 16, 36, 64, 100]
  >> [m+n for m in 'ABC' for n in 'XYZ']
  ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
  >> import os
  >> [d for d in os.listdir('.')]
  ['18.py', '19.py', '1.py', '2.py', '3.py', '4.py', '5.py', '6.py', '7.py', '8.py', '9.py', '10.py', '11.py', '12.py', '13.py', 'abstest.py', 'pycache', 'abstest2.py', '14.py', '15.py', '16.py', '17.py']
  >> [d for d in os.listdir('/')]
  ['boot', 'dev', 'proc', 'run', 'sys', 'etc', 'root', 'var', 'tmp', 'usr', 'bin', 'sbin', 'lib', 'lib64', 'home', 'media', 'mnt', 'opt', 'srv', '.autorelabel']
  >> [d for d in os.listdir('/home')]
  ['test2', 'test3', 'test4', 'test1']
  >> d={'x':'A','y':'B','z':'C'}
  >> for k,v in d.items():
  ...     print(k,'=',v)
  ...
  x = A
  y = B
  z = C
  >>
  >> d={'x':'A','y':'B','z':'C'}
  >> [k+'='+v for k,v in d.items()]
  ['x=A', 'y=B', 'z=C']
  >> L=['Hello','World','IBM','Apple']
  >> [s.lower() for s in L]
  ['hello', 'world', 'ibm', 'apple']
  >>
  >>
  >> L=['Hello','World',18,'IBM','Apple']
  >> [s.lower() for s in L]
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  File &quot;<stdin>&quot;, line 1, in <listcomp>
  AttributeError: 'int' object has no attribute 'lower'
  >>

  [root@mantisbt01 python]# cat 20.py
  #!/usr/bin/python
  #-- coding:utf-8 --
  L1=['Hello','World',18,'IBM',None]
  L2=[s.lower() for s in L1 if isinstance(s,str)]
  print(L2)
  if L2 == ['hello','world','ibm']:
  print('测试通过!')
  else:
  print('测试失败')
  [root@mantisbt01 python]# ./20.py
  ['hello', 'world', 'ibm']
  测试通过!
  [root@mantisbt01 python]#
  4.生成器

  >> L=[xx for x in range(10)]
  >> L
  [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
  >>
  >> g=(xx for x in range(10))
  >> g
  <generator object <genexpr> at 0x7f8ab91c8570>
  >> next(g)
  0
  >> next(g)
  1
  >> next(g)
  4
  >> next(g)
  9
  >> next(g)
  16
  >> next(g)
  25
  >> next(g)
  36
  >> next(g)
  49
  >> next(g)
  64
  >> next(g)
  81
  >> next(g)
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  StopIteration
  >>
  >> g=(x*x for x in range(10))
  >> for n in g:
  ...     print(n)
  ...
  0
  1
  4
  9
  16
  25
  36
  49
  64
  81
  >> def fib(max):
  ...     n,a,b=0,0,1
  ...     while n < max:
  ...         print(b)
  ...         a,b=b,a+b
  ...         n=n+1
  ...     return 'done'
  ...
  >> fib(6)
  1
  1
  2
  3
  5
  8
  'done'
  >>
  >> def fib(max):
  ...     n,a,b=0,0,1
  ...     while n < max:
  ...         yield b
  ...         a,b=b,a+b
  ...         n=n+1
  ...     return 'done'
  ...
  >> f=fib(6)
  >> f
  <generator object fib at 0x7f8ab91c8620>
  >>
  >> def odd():
  ...     print('step 1')
  ...     yield 1
  ...     print('step 2')
  ...     yield(3)
  ...     print('step 3')
  ...     yield(5)
  ...
  >> o=odd()
  >> next(o)
  step 1
  1
  >> next(o)
  step 2
  3
  >> next(o)
  step 3
  5
  >> next(o)
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  StopIteration
  >> for n in fib(6):
  ...     print(n)
  ...
  1
  1
  2
  3
  5
  8
  >> g=fib(6)
  >> while True:
  ...     try:
  ...         x=next(g)
  ...         print('g:',x)
  ...     except StopIteration as e:
  ...         print('Generator return value:',e.value)
  ...         break
  ...
  g: 1
  g: 1
  g: 2
  g: 3
  g: 5
  g: 8
  Generator return value: done
  >>

  练习
  [root@mantisbt01 python]# cat ./21.py
  #!/usr/bin/python
  #-- coding:utf-8 --
  def triangles():
  L=[1]
  while True:
  yield L
  L = [x+y for x,y in zip([0]+L,L+[0])]
  n = 0
  results = []
  for t in triangles():
  print(t)
  results.append(t)
  n = n + 1
  if n == 10:
  break
  if results == [
  [1],
  [1, 1],
  [1, 2, 1],
  [1, 3, 3, 1],
  [1, 4, 6, 4, 1],
  [1, 5, 10, 10, 5, 1],
  [1, 6, 15, 20, 15, 6, 1],
  [1, 7, 21, 35, 35, 21, 7, 1],
  [1, 8, 28, 56, 70, 56, 28, 8, 1],
  [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
  ]:
  print('测试通过!')
  else:
  print('测试失败!')
  [root@mantisbt01 python]#  ./21.py
  [1]
  [1, 1]
  [1, 2, 1]
  [1, 3, 3, 1]
  [1, 4, 6, 4, 1]
  [1, 5, 10, 10, 5, 1]
  [1, 6, 15, 20, 15, 6, 1]
  [1, 7, 21, 35, 35, 21, 7, 1]
  [1, 8, 28, 56, 70, 56, 28, 8, 1]
  [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
  测试通过!
  [root@mantisbt01 python]# cat ./22.py
  #!/usr/bin/python
  #-- coding:utf-8 --
  def triangles():
  L=[1]
  while True:
  yield L
  L = [x+y for x,y in zip([0]+L,L+[0])]
  n = 0
  results = []
  for t in triangles():
  print(t)
  results.append(t)
  n = n + 1
  if n == 15:
  break
  [root@mantisbt01 python]# ./22.py
  [1]
  [1, 1]
  [1, 2, 1]
  [1, 3, 3, 1]
  [1, 4, 6, 4, 1]
  [1, 5, 10, 10, 5, 1]
  [1, 6, 15, 20, 15, 6, 1]
  [1, 7, 21, 35, 35, 21, 7, 1]
  [1, 8, 28, 56, 70, 56, 28, 8, 1]
  [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
  [1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1]
  [1, 11, 55, 165, 330, 462, 462, 330, 165, 55, 11, 1]
  [1, 12, 66, 220, 495, 792, 924, 792, 495, 220, 66, 12, 1]
  [1, 13, 78, 286, 715, 1287, 1716, 1716, 1287, 715, 286, 78, 13, 1]
  [1, 14, 91, 364, 1001, 2002, 3003, 3432, 3003, 2002, 1001, 364, 91, 14, 1]
  [root@mantisbt01 python]#

  >> from collections import Iterable
  >> isinstance([],Iterable)
  True
  >> isinstance({},Iteranle)
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  NameError: name 'Iteranle' is not defined
  >> from collections import Iterable
  >> isinstance([],Iterable)
  True
  >> isinstance({},Iterable)
  True
  >> isinstance('abc',Iterable)
  True
  >> isinstance(x for x in range(10),Iterable)
  File &quot;<stdin>&quot;, line 1
  SyntaxError: Generator expression must be parenthesized if no           t sole argument
  >> isinstance((x for x in range(10)),Iterable)
  True
  >> isinstance(100,Iterable)
  False
  >>
  >> from collections import Iterator
  >> isinstance((x for x in range(10)),Iterator)
  True
  >> isinstance([],Iterator)
  False
  >> isinstance({},Iterator)
  False
  >> isinstance('ABC',Iterator)
  False
  >> isinstance(100,Iterator)
  False
  >> isinstance(iter([]),Iterator)
  True
  >> isinstance(iter('abc'),Iterator)
  True
  >>
  >>
  >> for x in [1,2,3,4,5]:
  ...     pass
  ...
  >> for x in [1,2,3,4,5]:
  ...     print(x)
  ...
  1
  2
  3
  4
  5
  >>
  >>
  >> it=iter([1,2,3,4,5])
  >> while True:
  ...     try:
  ...         x=next(it)
  ...         print(x)
  ...     except StopIteration:
  ...         break
  ...
  1
  2
  3
  4
  5
  >>

  凡是可作用于for循环的对象都是Iterable类型;
  凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
  集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
  函数式编程
  函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。
  函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
  Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。
  1.高阶函数
  传入函数
  既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
  一个最简单的高阶函数:

  >> abs
  <built-in function abs>
  >> abs(-10)
  10
  >> x=abs(-2)
  >> x
  2
  >> f=abs
  >> f
  <built-in function abs>
  >> f(-2)
  2
  >> abs=10
  >> abs
  10
  >> abs(-2)
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  TypeError: 'int' object is not callable

  [root@mantisbt01 python]# python
  Python 3.6.4 (default, Mar 19 2018, 10:30:22)
  [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
  Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.

  >> abs(-2)
  2
  >> f(-2)
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  NameError: name 'f' is not defined
  >> f=abs
  >> f(-2)
  2
  >> def add(x,y,f):
  ...     return f(x) + f(y)
  ...
  >> print(add(-5,6,abs))
  11

  map\reduce

  >> abs(-2)
  2
  >> f(-2)
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  NameError: name 'f' is not defined
  >> f=abs
  >> f(-2)
  2
  >> def add(x,y,f):
  ...     return f(x) + f(y)
  ...
  >> print(add(-5,6,abs))
  11
  >>
  >>
  >> def f(x):
  ...     return x*x
  ...
  >> r=map(f,[1,2,3,4,5,6,7,8,9])
  >> list(r)
  [1, 4, 9, 16, 25, 36, 49, 64, 81]
  >> r
  <map object at 0x7fa94a74ce10>
  >>
  >> L=[]
  >> for n in [1,2,3,4,5,6,7,8,9]:
  ...     L.append(f(n))
  ...
  >> print(L)
  [1, 4, 9, 16, 25, 36, 49, 64, 81]
  >>
  >> from functools import reduce
  >> def add(x,y):
  ...     return x+y
  ...
  >> reduce(add,[1,3,5,7,9])
  25
  >>
  >> from functools import reduce
  >> def fn(x,y):
  ...     return x*10+y
  ...
  >> reduce (fn,[1,3,5,7,9])
  13579
  >>
  >> from functools import reduce
  >> def fn(x,y):
  ...     return x*10+y
  ...
  >> def char2num(s):
  ...     digits = {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
  ...     return digits
  ...
  >> reduce (fn,map(char2num,'13579'))
  13579
  >>

  整理成一个函数

  >> from functools import reduce
  >> DIGITS = {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
  >> def str2int(s):
  ...     def fn(x,y):
  ...         return x*10+y
  ...     def char2num(s):
  ...         return DIGITS
  ...     return reduce(fn,map(char2num,s))
  ...
  >> print(str2int('13579'))
  13579
  >>
  >> from functools import reduce
  >> DIGTS={'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
  >> def char2sum(s):
  ...     return DIGITS
  ...
  >> def str2int(s):
  ...     return reduce(lambda x,y:x*10+y,map(char2num,s))
  ...
  >>
  >>
  >>
  >> str2int('13579')
  13579
  >> str2int('1239')
  1239
  >>

  利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']:

  >>
  >> def normalize(name):
  ...     name=name[0].upper()+name[1:].lower()
  ...     return name
  ...
  >> L1=['adam','LISA','BarT']
  >> Ls=list(map(normalize,L1))
  >> print(Ls)
  ['Adam', 'Lisa', 'Bart']
  >>
  >>
  >> def normalize2(name):
  ...     name=name.lower()
  ...     name=name.upper()
  ...     return name
  ...
  >> L1=['adam','LISA','BarT']
  >> L2=list(map(normalize2,L1))
  >> print(L2)
  ['ADAM', 'LISA', 'BART']
  >>
  >>
  >> def normalize3(name):
  ...     return name.capitalize()
  ...
  >> L2=list(map(normalize3,L1))
  >> print(L2)
  ['Adam', 'Lisa', 'Bart']
  >> L1=['adam','LISA','BarT']
  >> L2=list(map(normalize3,L1))
  >> print(L2)
  ['Adam', 'Lisa', 'Bart']
  >>

  Python提供的sum()函数可以接受一个list并求和,请编写一个prod()函数,可以接受一个list并利用reduce()求积:

  >> def prod(L):
  ...     def fn(x,y):
  ...         return xy
  ...     return reduce(fn,L)
  ...
  >> print('3579=',prod([3,5,7,9]))
  357*9= 945
  >> if prod([3,5,7,9])==945:
  ...     print('测试成功!')
  ... else:
  ...     print('测试失败!')
  ...
  测试成功!
  >>
  >>

  利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456:

  >> from functools import reduce
  >> def str2float(s):
  ...     def fn(x,y):
  ...         return x*10+y
  ...     n=s.index('.')
  ...     s1=list(map(int,[x for x in s[:n]]))
  ...     s2=list(map(int,[x for x in s[n+1:]]))
  ...     return reduce(fn,s1) + reduce(fn,s2)/10**len(s2)
  ...     print('str2float(\'123.456\') =', str2float('123.456'))
  ...
  >>
  >> print('str2float(\'123.456\') =', str2float('123.456'))
  str2float('123.456') = 123.456
  >>
  >> if abs(str2float('123.456') - 123.456) < 0.00001:
  ...     print('测试成功!')
  ... else:
  ...     print('测试失败!')
  ...
  测试成功!
  >>
  >> print('str2float(\'1.43\') =', str2float('1.43'))
  str2float('1.43') = 1.43
  >>
  >>

  filter
  用filter求素数
  计算素数的一个方法是埃氏筛法,它的算法理解起来非常简单:
  首先,列出从2开始的所有自然数,构造一个序列:
  2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
  取序列的第一个数2,它一定是素数,然后用2把序列的2的倍数筛掉:
  3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
  取新序列的第一个数3,它一定是素数,然后用3把序列的3的倍数筛掉:
  5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
  取新序列的第一个数5,然后用5把序列的5的倍数筛掉:
  7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
  不断筛下去,就可以得到所有的素数。

  >> def is_odd(n):
  ...     return n%2 ==1
  ...
  >> list(filter(is_odd,[1,2,4,6,9,10]))
  [1, 9]
  >> list(filter(is_odd,[1,2,4,5,6,9,10,15]))
  [1, 5, 9, 15]
  >>
  >> def not_empty(s):
  ...     return s and s.strip()
  ...
  >> list(filter(not_empty,['A','','B',None,'C',' ']))
  ['A', 'B', 'C']
  >>
  >>
  >>
  >>
  >>
  >> def _odd_iter():
  ...     n=1
  ...     while True:
  ...         n=n+2
  ...         yield n
  ...
  >>
  >>
  >> def primes():
  ...     yield 2
  ...     it = _odd_iter()
  ...     while True:
  ...         n=next(it)
  ...         yield n
  ...         it=filter(_not_divisible(n),it)
  ...
  >>
  >> for n in primes():
  ...     if n < 1000:
  ...         print(n)
  ...     else:
  ...         break
  ...
  2
  3
  5
  7
  11
  13
  17
  19
  23
  29
  31
  37
  41
  43
  47
  53
  59
  61
  67
  71
  73
  79
  83
  89
  97
  101
  103
  107
  109
  113
  127
  131
  137
  139
  149
  151
  157
  163
  167
  173
  179
  181
  191
  193
  197
  199
  211
  223
  227
  229
  233
  239
  241
  251
  257
  263
  269
  271
  277
  281
  283
  293
  307
  311
  313
  317
  331
  337
  347
  349
  353
  359
  367
  373
  379
  383
  389
  397
  401
  409
  419
  421
  431
  433
  439
  443
  449
  457
  461
  463
  467
  479
  487
  491
  499
  503
  509
  521
  523
  541
  547
  557
  563
  569
  571
  577
  587
  593
  599
  601
  607
  613
  617
  619
  631
  641
  643
  647
  653
  659
  661
  673
  677
  683
  691
  701
  709
  719
  727
  733
  739
  743
  751
  757
  761
  769
  773
  787
  797
  809
  811
  821
  823
  827
  829
  839
  853
  857
  859
  863
  877
  881
  883
  887
  907
  911
  919
  929
  937
  941
  947
  953
  967
  971
  977
  983
  991
  997
  >>

  回数是指从左向右读和从右向左读都是一样的数,例如12321,909。请利用filter()筛选出回数:

  >> def is_palindrome(n):
  ...     if str(n)==str(str(n)[::-1]):
  ...         return n
  ...
  >> out=filter(is_palindrome,range(1,1000))
  >>
  >> print('1~1000:',list(out))
  1~1000: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191, 202, 212, 222, 232, 242, 252, 262, 272, 282, 292, 303, 313, 323, 333, 343, 353, 363, 373, 383, 393, 404, 414, 424, 434, 444, 454, 464, 474, 484, 494, 505, 515, 525, 535, 545, 555, 565, 575, 585, 595, 606, 616, 626, 636, 646, 656, 666, 676, 686, 696, 707, 717, 727, 737, 747, 757, 767, 777, 787, 797, 808, 818, 828, 838, 848, 858, 868, 878, 888, 898, 909, 919, 929, 939, 949, 959, 969, 979, 989, 999]
  >> out=filter(is_palindrome,range(1,200))
  >> print('1~200:',list(out))
  1~200: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191]
  >>

  貌似不能判断最后一个元素

  >> out=filter(is_palindrome,1)
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  TypeError: 'int' object is not iterable
  >> out=filter(is_palindrome,range(1))
  >> print('1:',list(out))
  1: []
  >> out=filter(is_palindrome,range(1,2))
  >> print('1:',list(out))
  1: [1]
  >> out=filter(is_palindrome,range(1,3))
  >> print('1~3:',list(out))
  1~3: [1, 2]
  >> out=filter(is_palindrome,range(1,11))
  >> print('1~3:',list(out))
  1~3: [1, 2, 3, 4, 5, 6, 7, 8, 9]
  >> out=filter(is_palindrome,range(1,12))
  >> print('1~3:',list(out))
  1~3: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11]
  >>

  法2

  >> def is_palindrome(n):
  ...     a=list(str(n))
  ...     b=list(str(n))
  ...     b.reverse()
  ...     return a==b
  ...
  >>
  >> out=filter(is_palindrome,range(1,11))
  >> print('1~3:',list(out))
  1~3: [1, 2, 3, 4, 5, 6, 7, 8, 9]
  >> out=filter(is_palindrome,range(1,12))
  >> print('1~3:',list(out))
  1~3: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11]
  >>
  >> a=range(1,5)
  >> a
  range(1, 5)
  >> list(a)
  [1, 2, 3, 4]
  >>
  >>
  >>

  sorted

  >> sorted([2,4,-6,21,9])
  [-6, 2, 4, 9, 21]
  >> sorted([2,4,-6,21,-9])
  [-9, -6, 2, 4, 21]
  >> sorted([2,4,-6,21,-9,0])
  [-9, -6, 0, 2, 4, 21]
  >> sorted([2,4,-6,21,-9,0],key=abs)
  [0, 2, 4, -6, -9, 21]
  >> sorted(['Bob','about','Zoo','Credit','kel'])
  ['Bob', 'Credit', 'Zoo', 'about', 'kel']
  >>
  >> sorted(['bob','about','Zoo','Credit'],key=str.lower)
  ['about', 'bob', 'Credit', 'Zoo']
  >>
  >> sorted(['bob','about','Zoo','Credit'],key=str.lower,reverse=True)
  ['Zoo', 'Credit', 'bob', 'about']
  >>
  >> L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]

  按分数排序

  >> sorted(L,key=lambda x:x[1])
  [('Bart', 66), ('Bob', 75), ('Lisa', 88), ('Adam', 92)]

  按名字排序

  >> sorted(L,key=lambda x:x[0])
  [('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]
  >>


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-546905-1-1.html 上篇帖子: Python线程同步 下篇帖子: Python3安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表