1. 程式人生 > 其它 >Python三元表達-內建函式

Python三元表達-內建函式

三元表示

  '''使用場景:二選一的時候  推薦使用三元表示式'''
  # 編寫一個求兩個數大小的函式
    def index(a, b):
        if a > b:
             return a
        else:  # 可以省略
             return b
  # 如果使用者名稱是jason則列印管理員  否則列印DDD
    username = input('username>>>:').strip()
    if username == 'jason':
        print('管理員')
    else:
        print('DDD')
  
  '''
      三元表示式
        值1 if 條件 else 值2
        條件如果成立則使用1(if前面的資料)
        條件如果不成立則使用值2(else後面的資料)
  '''

   username = input('username>>>:').strip()
   res = '管理員' if username == 'jason' else 'DSB'
   print(res)
  '''三元表示式只用於二選一的情況 最好不要巢狀使用(語法不簡潔)'''
   res = '下午' if 1 == 1 else (2 if 2==3 else '上午')  # 不推薦
  """並不是程式碼寫的最少乾的事越多就與牛逼 還有一個前提>>>:簡潔易讀"""

   寫一個電影系統 需要決定電影是否收費

   is_change = input('是否收費>>>:').strip()
   is_free = '收費' if is_change == 'y' else '免費'
   print(is_free)


  # 補充:針對if分支結構 也有簡化版本(瞭解即可)
  '''子程式碼塊都只有簡單的一行情況下 也可以簡寫  沒有三元表示式簡單 但是也有人用'''

  name = 'jason'
  if name == 'jason': print(name)
  else: print('嘿嘿嘿')

各種生成式

1.列表生成式

  name_list = ['jason', 'kevin', 'tony', 'oscar', 'jerry']
  '''需求:將列表中所有的人名後面加上_DSB'''
  # 以我們之前掌握的知識能否實現>>>:可以
  # 1.建立一個空的列表用於儲存修改之後的資料
   new_list = []

   # 2.for迴圈列表獲取每一個人名
   for name in name_list:  # 'jason'    'kevin'   字串
  #     # 3.字串末位拼接_DSB
       res = name + '_DSB'
  #     # 4.新增到新的列表中
       new_list.append(res)
   print(new_list)

  # 列表生成式:該技術可以簡化程式碼 也可以不用 無外乎寫的複雜一點而已
   res = [name+'_SB' for name in name_list]
   print(res)

  # 列表生成式複雜用法:還具備篩選能力
  res = [name+'_SB' for name in name_list if name == 'jason']
  print(res)
  res = [name+'_SB' for name in name_list if name != 'jason']
  print(res)
  '''列表生成式中值允許出現for和if 不能出現else 因為會產生歧義(for和if都能結合else)'''

2.字典生成式

  l1 = ['name', 'age', 'pwd']
  l2 = ['jason', 18, 123]
  # 需求:將上述兩個列表分別製作成字典的鍵值
  # 1.定義一個空字典
   new_dict = {}

  # 2.每次迴圈都要拿到兩個列表中對應的元素(索引相等)
   for i in range(len(l1)):

  # 3.索引取值即可
   new_dict[l1[i]] = l2[i]
   print(new_dict)

  # 字典生成式
  res = {l1[i]: l2[i] for i in range(len(l1))}
  print(res)  # {'name': 'jason', 'age': 18, 'pwd': 123}
  res = {l1[i]: l2[i] for i in range(len(l1)) if i == 1}
  print(res)  # {'age': 18}

3.集合生成式

  res = {i for i in range(10)}
  print(res, type(res))
  res = {i for i in range(10) if i != 2}
  print(res, type(res))

  """沒有元組生成式 依據上述寫法得到的時候後續我們要學習的知識:迭代器"""

匿名函式

  匿名函式的意思就是沒有函式名
      沒有函式名的函式如何呼叫呢?
      需要結合其他函式一起使用

  # 定義匿名函式
    lambda x:x+2
  '''
    lambda 形參:返回值
      α β γ
    如果用普通函式來表示
    def index(x):
      return x + 2
  '''
  print(lambda x:x+2)

  max:統計最大值
  l1 = [11, 32, 41, 22, 13, 66, 54, 78, 96, 34, 54, 99, 35]
  print(max(l1))  # 直接獲取資料集中最大的元素值

    info = {
      'Aason':9999999,
      'Jacob':123,
      'zark':1000,
      'berk':33
  }
  比如說你要求薪資最高的人姓名
  print(max(info))  # zark

  '''
    max底層可以看成是for迴圈依次比較  針對字典預設只能獲取到K
    獲取到K之後如果是字串的英文字母  則會按照ASCII碼錶轉成數字比較
      A~Z:65-90
      a~z:97-122
  '''

  def index(k):
     return info[k]
  print(max(info,key=index))  # key對應的函式返回什麼 max就以什麼做比較的依據
  # 比較的是v 返回的是k  key相當於是可以更改比較規則的引數

  # 上述程式碼可以簡寫  因為函式功能很單一
    print(max(info, key=lambda key:info[key]))  # Aason

常見重要內建函式

1.內建函式之 map對映

   l1 = [11, 22, 33, 44, 55]
  # 需求:元素全部自增10
  # 方式1:列表生成式
  # 方式2:內建函式
   def index(n):
       return n + 10
   res = map(index,l1)
   print(res)  # 迭代器(節省空間的 目前不用考慮)
   print(list(res))  # [21, 32, 43, 54, 65]
   res = map(lambda x: x + 10, l1)
   print(list(res))  # [21, 32, 43, 54, 65]

2.內建函式之zip拉鍊

   l1 = [11, 22, 33, 44]
   l2 = ['jason','kevin','tony','oscar']
  # 需求:將兩個列表中的元素一一對應成對即可
   res = zip(l1,l2)  # 結果是一個迭代器
   print(res)  # 目前想看裡面的資料 用list轉換一下即可
   print(list(res))   [(11, 'jason'), (22, 'kevin'), (33, 'tony'), (44, 'oscar')]
  '''zip可以整合多個數據集'''
   l1 = [11, 22, 33, 44]
   l2 = ['jason','kevin','tony','oscar']
   l3 = [1,2,3,4]
   l4 = [55,66,77,88]
   res = zip(l1,l2,l3,l4)
   print(list(res))
  # 不使用zip也可以
   res1 = [(l1[i],l2[i],l3[i],l4[i]) for i in range(len(l1))]
   print(res1)
  '''zip可以整合多個數據集 如果資料集之間個數不一致 那麼依據短的'''
   l1 = [11, 22, 33, 44, 55]
   l2 = ['jason', 'kevin']
   res = zip(l1,l2)
   print(list(res))

內建函式之filter過濾

   l1 = [11, 22, 33, 44, 55, 66]
  '''需求:篩選出大於30的元素'''
  # 方式1:列表生成式
  # 方式2:內建函式
   def index(x):
       return x > 30
   res = filter(index,l1)
   print(list(res))  # [33, 44, 55, 66]
   res = filter(lambda x:x>30, l1)
   print(list(res))

4.內建函式之reduce歸總

  '''以前是內建函式 現在是某個模組下面的子函式(後面講)'''
  from functools import reduce

  l1 = [11, 22, 33]
  '''需求:講列表中所有的元素相加'''
   def index(x,y):
       return x + y
   res = reduce(index,l1)
   print(res)  # 66
  res = reduce(lambda x, y: x + y, l1)
  print(res)  # 66
  res = reduce(lambda x, y: x + y, l1, 100)
  print(res)  # 166
  """掌握到能夠語言表達出大致意思"""

常見內建函式

  1.abs()  獲取絕對值(不考慮正負號)
  print(abs(-123))
  print(abs(123))

  # 2.all()與any()
    l1 = [0, 0, 1, 0, True]
    print(all(l1))  # False  資料集中必須所有的元素對應的布林值為True返回的結果才是True
    print(any(l1))  # True   資料集中只要所有的元素對應的布林值有一個為True  返回的結果就是True

  # 3.bin() oct() hex()  產生對應的進位制數
    print(bin(100))
    print(oct(100))
    print(hex(100))

  # 4.bytes()  型別轉換
      s = '你好啊 hello world'
      打印出來的則是編碼
    '''針對編碼解碼 可以使用關鍵字encode與decode  也可以使用bytes和str'''
    s1 = '天黑了 抓緊進屋吧!!!'
    編碼
    res = bytes(s1, 'utf8')
    print(res)
    解碼
    res1 = str(res, 'utf8')
    print(res1)

  # 5.callable()  判斷當前物件是否可以加括號呼叫
    name = 'jason'
    def index():pass
    print(callable(name))  # False  變數名不能加括號呼叫
    print(callable(index))  # True  函式名可以加括號呼叫

  # 6.chr(), ord()  字元與數字的對應轉換
    print(chr(65))  # A  根據數字轉字元  依據ASCII碼
    print(ord('A'))  # 65  根據字元轉數字  依據ASCII碼

  # 7.dir()  返回資料型別可以呼叫的內建方法(檢視物件內部可呼叫的屬性)
    print(dir(123))
    print(dir('jason'))

  # 8.divmod()
    '''
      可以使用在網站的分頁製作上
       練習題:   問
              總共250條資料 每頁展示25條 需要多少頁  10頁
              總共251條資料 每頁展示25條 需要多少頁  11頁
              總共249條資料 每頁展示25條 需要多少頁  10頁

    '''
     print(divmod(250,25))  # (10, 0)  第一個引數是整數部分 第二個是餘數部分
     print(divmod(251,25))  # (10, 1)
     print(divmod(249,25))  # (9, 24)
     def get_page_num(total_num,page_num):  # 後面django分頁器使用
         more,others = divmod(total_num, page_num)
         if others:
             more += 1
         print('需要%s頁'%more)
     get_page_num(1000,30)

  # 9.enumerate() 列舉
     name_list = ['jason', 'kevin', 'oscar', 'tony']
     for name in name_list:
        print(name)
     for i,j in enumerate(name_list):
        print(i,j)  # i類似於是計數 預設從0開始
     for i,j in enumerate(name_list,start=1):
        print(i,j)  # 還可以控制起始位置

  # 10.eval()  exec()  識別字符串中的python程式碼  使用頻率很低
      print('print("有點餓了")')
      eval('print("有點餓了111")')
      exec('print("有點餓了222")')
    res = 
    """
      for i in range(10):
        print(i)
    """
    # eval(res)  只能識別簡單邏輯的python程式碼
    # exec(res)  能夠識別具有與一定邏輯的python程式碼